diff --git a/.forgejo/workflows/publish.yaml b/.forgejo/workflows/publish.yaml
index e1eb45a..5782bae 100644
--- a/.forgejo/workflows/publish.yaml
+++ b/.forgejo/workflows/publish.yaml
@@ -65,7 +65,7 @@ jobs:
- name: Build and push
uses: docker/build-push-action@v6
with:
- platforms: linux/amd64
+ platforms: linux/amd64,linux/arm64
push: true
context: "{{defaultContext}}:${{ matrix.box.path }}"
tags: |
diff --git a/boxes/devbox/.justfile b/boxes/devbox/.justfile
deleted file mode 100644
index 3d15b8b..0000000
--- a/boxes/devbox/.justfile
+++ /dev/null
@@ -1,21 +0,0 @@
-clean := "false"
-box_name := file_stem(invocation_directory())
-
-unexport GOBIN
-unexport GOPATH
-unexport GOROOT
-
-
-# Create a new box from current directory
-[no-cd]
-build box_name:
- [[ "{{clean}}" == "true" ]] && sudo rm -rf ${HOME}/chroots/{{ box_name }} || true
-
- podman build -t {{box_name}}:latest .
-
- distrobox assemble create
-
-# Enter the box
-enter box_name:
- clear
- @distrobox enter --clean-path --no-workdir {{box_name}}
diff --git a/boxes/devbox/Dockerfile b/boxes/devbox/Dockerfile
index aa7f5fb..b964e6d 100644
--- a/boxes/devbox/Dockerfile
+++ b/boxes/devbox/Dockerfile
@@ -1,50 +1,22 @@
-FROM rust:latest AS rust-builder
+FROM quay.io/toolbx-images/alpine-toolbox:edge
-# setup cargo packages, prefer to use apk packages
-# to reduce build time and space
-RUN --mount=type=cache,target=/app/target/ \
- --mount=type=cache,target=/usr/local/cargo/git/db \
- --mount=type=cache,target=/usr/local/cargo/registry/ \
- curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash \
- && cargo binstall --no-confirm \
- dotter
-
-FROM ghcr.io/void-linux/void-glibc-full:latest
-
-# Setup void packages
-RUN --mount=type=cache,target=/var/cache/xbps/ \
- xbps-install -Syu \
- && xbps-install -Sy \
- bash \
- bat \
- cocogitto \
+# Update system and install packages
+RUN apk update && apk upgrade && \
+ apk add --no-cache \
+ neovim \
+ git \
+ lazygit \
+ zsh \
curl \
- eza \
+ wget \
+ ripgrep \
fd \
fzf \
- gcc \
- git \
- just \
- lazygit \
- neovim \
- nodejs \
- ripgrep \
- sd \
- starship \
- tealdeer \
- tmux \
- tree-sitter \
- void-repo-multilib \
- void-repo-multilib-nonfree \
- void-repo-nonfree \
- yazi \
- zoxide \
- zsh
-
-# Import cargo packages
-COPY --from=rust-builder /usr/local/cargo/bin/* /usr/local/bin/
-
-COPY ./scripts/* /usr/local/bin/
+ alpine-sdk \
+ build-base \
+ python3 \
+ py3-pip \
+ openssh
# Set environment variables
ENV EDITOR=nvim \
@@ -52,14 +24,18 @@ ENV EDITOR=nvim \
TERM=xterm-256color \
LANG=en_US.UTF-8 \
LC_ALL=en_US.UTF-8 \
- SHELL=/usr/bin/zsh
+ SHELL=/bin/zsh
-# Basic setup
-RUN \
- # chsh -s /usr/bin/nu \
- chsh -s /usr/bin/zsh \
- && chmod +x /usr/local/bin/*
+# Install and initialize chezmoi
+RUN sh -c "$(curl -fsLS get.chezmoi.io)" -- -b /usr/local/bin && \
+ mkdir -p ~/.local/share/chezmoi
+
+RUN chsh -s /bin/zsh
+
+RUN mkdir -p /workspace
+
+WORKDIR /workspace
# Build commands:
-# Docker: docker build -t devbox .
-# Podman: podman build -t devbox .
+# Docker: docker build -t dev-env .
+# Podman: podman build -t dev-env .
diff --git a/boxes/devbox/distrobox.ini b/boxes/devbox/distrobox.ini
index e459b93..8e37068 100644
--- a/boxes/devbox/distrobox.ini
+++ b/boxes/devbox/distrobox.ini
@@ -1,16 +1,13 @@
[devbox]
-image=git.alecodes.page/alecodes/devbox:latest
+image=devbox:latest
replace=true
pull=false
init=true
+unshare_all=true
root=false
start_now=true
+additional_packages="git neovim"
+
home="${HOME}/chroots/devbox"
-volume="${HOME}/.ssh:${HOME}/chroots/devbox/.ssh"
-
-additional_packages=""
-additional_flags="--hostname devbox"
-
-init_hooks=if [ -e /usr/local/bin/fetch_dots ]; then sudo -u aleidk sh -c "/usr/local/bin/fetch_dots" && rm /usr/local/bin/fetch_dots; fi
diff --git a/boxes/devbox/scripts/fetch_dots b/boxes/devbox/scripts/fetch_dots
deleted file mode 100644
index c802d5d..0000000
--- a/boxes/devbox/scripts/fetch_dots
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env bash
-
-set -e pipefail
-
-base_dir="$HOME/Repos/Private/"
-
-mkdir -p "$base_dir"
-
-cd "$base_dir" || exit
-
-if [ -d dots ]; then
- echo "Dots already exists, updating..."
- cd dots || exit
- git pull --rebase --autostash
-
-else
- git clone ssh://git@git.alecodes.page:24062/alecodes/dots.git
-
- cd dots || exit
-
- git checkout dotter-migration
-fi
-
-echo "Fixing permissions..."
-chown -R 1000:1000 "$base_dir"
-
-echo "Deploying dots..."
-dotter deploy
diff --git a/boxes/devbox/scripts/setup_go b/boxes/devbox/scripts/setup_go
deleted file mode 100644
index c3ee02e..0000000
--- a/boxes/devbox/scripts/setup_go
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env bash
-
-set -e pipefail
-
-sudo xbps-install -Sy go
-
-go install mvdan.cc/gofumpt@latest
-go install -v github.com/incu6us/goimports-reviser/v3@latest
-go install github.com/segmentio/golines@latest
-go install golang.org/x/tools/gopls@latest
diff --git a/ostree-images/river/Dockerfile b/ostree-images/river/Dockerfile
new file mode 100644
index 0000000..6f1475c
--- /dev/null
+++ b/ostree-images/river/Dockerfile
@@ -0,0 +1,206 @@
+# Originally generated from https://github.com/wayblueorg/wayblue
+
+
+# This stage is responsible for holding onto
+# your config without copying it directly into
+# the final image
+FROM scratch AS stage-files
+COPY ./files /files
+
+# Copy modules
+# The default modules are inside blue-build/modules
+# Custom modules overwrite defaults
+FROM scratch AS stage-modules
+COPY --from=ghcr.io/blue-build/modules:latest /modules /modules
+COPY ./modules /modules
+
+# Bins to install
+# These are basic tools that are added to all images.
+# Generally used for the build process. We use a multi
+# stage process so that adding the bins into the image
+# can be added to the ostree commits.
+FROM scratch AS stage-bins
+COPY --from=gcr.io/projectsigstore/cosign /ko-app/cosign /bins/cosign
+COPY --from=docker.io/mikefarah/yq /usr/bin/yq /bins/yq
+COPY --from=ghcr.io/blue-build/cli:latest-installer /out/bluebuild /bins/bluebuild
+
+# Keys for pre-verified images
+# Used to copy the keys into the final image
+# and perform an ostree commit.
+#
+# Currently only holds the current image's
+# public key.
+FROM scratch AS stage-keys
+COPY cosign.pub /keys/river.pub
+
+
+# Main image
+FROM quay.io/fedora-ostree-desktops/base:41 AS river
+ARG RECIPE=./recipes/recipe-river.yml
+ARG IMAGE_REGISTRY=localhost
+ARG CONFIG_DIRECTORY="/tmp/files"
+ARG MODULE_DIRECTORY="/tmp/modules"
+ARG IMAGE_NAME="river"
+ARG BASE_IMAGE="quay.io/fedora-ostree-desktops/base"
+ARG FORCE_COLOR=1
+ARG CLICOLOR_FORCE=1
+ARG RUST_LOG_STYLE=always
+# Key RUN
+RUN --mount=type=bind,from=stage-keys,src=/keys,dst=/tmp/keys \
+ mkdir -p /etc/pki/containers/ \
+ mkdir -p /usr/etc/pki/containers/ \
+ && cp /tmp/keys/* /etc/pki/containers/ \
+ && cp /tmp/keys/* /usr/etc/pki/containers/ \
+ && ostree container commit
+
+# Bin RUN
+RUN --mount=type=bind,from=stage-bins,src=/bins,dst=/tmp/bins \
+ mkdir -p /usr/bin/ \
+ && cp /tmp/bins/* /usr/bin/ \
+ && ostree container commit
+
+# Module RUNs
+RUN \
+ --mount=type=bind,from=stage-files,src=/files,dst=/tmp/files,rw \
+ --mount=type=bind,from=stage-modules,src=/modules,dst=/tmp/modules,rw \
+ --mount=type=bind,from=ghcr.io/blue-build/cli:7c5578994e79d13d8780406600dc796422e22c8c-build-scripts,src=/scripts/,dst=/tmp/scripts/ \
+ --mount=type=cache,dst=/var/cache/rpm-ostree,id=rpm-ostree-cache-river-41,sharing=locked \
+ /tmp/scripts/run_module.sh 'rpm-ostree' '{"type":"rpm-ostree","install":["sddm","sddm-themes","qt5-qtgraphicaleffects","qt5-qtquickcontrols2","qt5-qtsvg","kwallet","pam-kwallet"]}' \
+ && ostree container commit
+RUN \
+ --mount=type=bind,from=stage-files,src=/files,dst=/tmp/files,rw \
+ --mount=type=bind,from=stage-modules,src=/modules,dst=/tmp/modules,rw \
+ --mount=type=bind,from=ghcr.io/blue-build/cli:7c5578994e79d13d8780406600dc796422e22c8c-build-scripts,src=/scripts/,dst=/tmp/scripts/ \
+ --mount=type=cache,dst=/var/cache/rpm-ostree,id=rpm-ostree-cache-river-41,sharing=locked \
+ /tmp/scripts/run_module.sh 'script' '{"type":"script","scripts":["setsddmtheming.sh"]}' \
+ && ostree container commit
+RUN \
+ --mount=type=bind,from=stage-files,src=/files,dst=/tmp/files,rw \
+ --mount=type=bind,from=stage-modules,src=/modules,dst=/tmp/modules,rw \
+ --mount=type=bind,from=ghcr.io/blue-build/cli:7c5578994e79d13d8780406600dc796422e22c8c-build-scripts,src=/scripts/,dst=/tmp/scripts/ \
+ --mount=type=cache,dst=/var/cache/rpm-ostree,id=rpm-ostree-cache-river-41,sharing=locked \
+ /tmp/scripts/run_module.sh 'systemd' '{"type":"systemd","system":{"enabled":["sddm-boot.service"]}}' \
+ && ostree container commit
+COPY --from=ghcr.io/ublue-os/akmods:main-41 /rpms /tmp/rpms
+RUN find /tmp/rpms
+RUN rpm -q ublue-os-akmods-addons || rpm-ostree install /tmp/rpms/ublue-os/ublue-os-akmods-addons*.rpm
+COPY --from=ghcr.io/ublue-os/main-kernel:41 /tmp/rpms /tmp/rpms/kernel
+RUN \
+ --mount=type=bind,from=stage-files,src=/files,dst=/tmp/files,rw \
+ --mount=type=bind,from=stage-modules,src=/modules,dst=/tmp/modules,rw \
+ --mount=type=bind,from=ghcr.io/blue-build/cli:7c5578994e79d13d8780406600dc796422e22c8c-build-scripts,src=/scripts/,dst=/tmp/scripts/ \
+ --mount=type=cache,dst=/var/cache/rpm-ostree,id=rpm-ostree-cache-river-41,sharing=locked \
+ /tmp/scripts/run_module.sh 'script' '{"type":"script","scripts":["installsignedkernel.sh"]}' \
+ && ostree container commit
+RUN rpm-ostree install just powerstat
+COPY --from=ghcr.io/ublue-os/config:latest /rpms/ublue-os-udev-rules.noarch.rpm /
+COPY --from=ghcr.io/ublue-os/config:latest /rpms/ublue-os-update-services.noarch.rpm /
+COPY --from=ghcr.io/ublue-os/config:latest /rpms/ublue-os-signing.noarch.rpm /
+COPY --from=ghcr.io/ublue-os/config:latest /rpms/ublue-os-luks.noarch.rpm /
+COPY --from=ghcr.io/ublue-os/config:latest /rpms/ublue-os-just.noarch.rpm /
+RUN rpm -ivh /ublue-os-udev-rules.noarch.rpm
+RUN rpm -ivh /ublue-os-update-services.noarch.rpm
+RUN rpm -ivh /ublue-os-signing.noarch.rpm
+RUN rpm -ivh /ublue-os-luks.noarch.rpm
+RUN rpm -ivh /ublue-os-just.noarch.rpm
+RUN \
+ --mount=type=bind,from=stage-files,src=/files,dst=/tmp/files,rw \
+ --mount=type=bind,from=stage-modules,src=/modules,dst=/tmp/modules,rw \
+ --mount=type=bind,from=ghcr.io/blue-build/cli:7c5578994e79d13d8780406600dc796422e22c8c-build-scripts,src=/scripts/,dst=/tmp/scripts/ \
+ --mount=type=cache,dst=/var/cache/rpm-ostree,id=rpm-ostree-cache-river-41,sharing=locked \
+ /tmp/scripts/run_module.sh 'script' '{"type":"script","scripts":["installandroidudev.sh","installrpmfusion.sh"]}' \
+ && ostree container commit
+RUN \
+ --mount=type=bind,from=stage-files,src=/files,dst=/tmp/files,rw \
+ --mount=type=bind,from=stage-modules,src=/modules,dst=/tmp/modules,rw \
+ --mount=type=bind,from=ghcr.io/blue-build/cli:7c5578994e79d13d8780406600dc796422e22c8c-build-scripts,src=/scripts/,dst=/tmp/scripts/ \
+ --mount=type=cache,dst=/var/cache/rpm-ostree,id=rpm-ostree-cache-river-41,sharing=locked \
+ /tmp/scripts/run_module.sh 'rpm-ostree' '{"type":"rpm-ostree","install":["rofi-wayland","power-profiles-daemon","xorg-x11-server-Xwayland","headsetcontrol","mediainfo","polkit","xfce-polkit","fprintd-pam","xdg-user-dirs","dbus-tools","dbus-daemon","wl-clipboard","pavucontrol","playerctl","qt5-qtwayland","qt6-qtwayland","vulkan-validation-layers","vulkan-tools","google-noto-emoji-fonts","gnome-disk-utility","ddcutil","openssl","vim","just","alsa-firmware","p7zip","unrar","wireplumber","pipewire","pamixer","pulseaudio-utils","network-manager-applet","NetworkManager-openvpn","NetworkManager-openconnect","bluez","bluez-tools","blueman","firewall-config","thunar","thunar-archive-plugin","thunar-volman","xarchiver","imv","p7zip","gvfs-mtp","gvfs-gphoto2","gvfs-smb","gvfs-nfs","gvfs-fuse","gvfs-archive","android-tools","slurp","grim","wlr-randr","wlsunset","brightnessctl","kanshi","dunst","adwaita-qt5","fontawesome-fonts-all","gnome-themes-extra","gnome-icon-theme","paper-icon-theme","breeze-icon-theme","papirus-icon-theme"]}' \
+ && ostree container commit
+RUN \
+ --mount=type=bind,from=stage-files,src=/files,dst=/tmp/files,rw \
+ --mount=type=bind,from=stage-modules,src=/modules,dst=/tmp/modules,rw \
+ --mount=type=bind,from=ghcr.io/blue-build/cli:7c5578994e79d13d8780406600dc796422e22c8c-build-scripts,src=/scripts/,dst=/tmp/scripts/ \
+ --mount=type=cache,dst=/var/cache/rpm-ostree,id=rpm-ostree-cache-river-41,sharing=locked \
+ /tmp/scripts/run_module.sh 'script' '{"type":"script","scripts":["installproprietarypackages.sh"]}' \
+ && ostree container commit
+RUN \
+ --mount=type=bind,from=stage-files,src=/files,dst=/tmp/files,rw \
+ --mount=type=bind,from=stage-modules,src=/modules,dst=/tmp/modules,rw \
+ --mount=type=bind,from=ghcr.io/blue-build/cli:7c5578994e79d13d8780406600dc796422e22c8c-build-scripts,src=/scripts/,dst=/tmp/scripts/ \
+ --mount=type=cache,dst=/var/cache/rpm-ostree,id=rpm-ostree-cache-river-41,sharing=locked \
+ /tmp/scripts/run_module.sh 'rpm-ostree' '{"type":"rpm-ostree","install":["heif-pixbuf-loader","ffmpeg","ffmpeg-libs","ffmpegthumbnailer","pipewire-libs-extra","libfdk-aac","gstreamer1-plugins-bad","gstreamer1-plugins-ugly"],"remove":["gstreamer1-plugins-bad-free","gstreamer1-plugins-bad-free-libs","gstreamer1-plugins-ugly-free","fdk-aac-free","ffmpeg-free","libavcodec-free","libavdevice-free","libavfilter-free","libavformat-free","libavutil-free","libpostproc-free","libswresample-free","libswscale-free"]}' \
+ && ostree container commit
+RUN \
+ --mount=type=bind,from=stage-files,src=/files,dst=/tmp/files,rw \
+ --mount=type=bind,from=stage-modules,src=/modules,dst=/tmp/modules,rw \
+ --mount=type=bind,from=ghcr.io/blue-build/cli:7c5578994e79d13d8780406600dc796422e22c8c-build-scripts,src=/scripts/,dst=/tmp/scripts/ \
+ --mount=type=cache,dst=/var/cache/rpm-ostree,id=rpm-ostree-cache-river-41,sharing=locked \
+ /tmp/scripts/run_module.sh 'script' '{"type":"script","scripts":["removeunusedrepos.sh"]}' \
+ && ostree container commit
+RUN \
+ --mount=type=bind,from=stage-files,src=/files,dst=/tmp/files,rw \
+ --mount=type=bind,from=stage-modules,src=/modules,dst=/tmp/modules,rw \
+ --mount=type=bind,from=ghcr.io/blue-build/cli:7c5578994e79d13d8780406600dc796422e22c8c-build-scripts,src=/scripts/,dst=/tmp/scripts/ \
+ --mount=type=cache,dst=/var/cache/rpm-ostree,id=rpm-ostree-cache-river-41,sharing=locked \
+ /tmp/scripts/run_module.sh 'files' '{"type":"files","files":[{"source":"system/usr","destination":"/usr"},{"source":"system/etc","destination":"/etc"}]}' \
+ && ostree container commit
+RUN \
+ --mount=type=bind,from=stage-files,src=/files,dst=/tmp/files,rw \
+ --mount=type=bind,from=stage-modules,src=/modules,dst=/tmp/modules,rw \
+ --mount=type=bind,from=ghcr.io/blue-build/cli:7c5578994e79d13d8780406600dc796422e22c8c-build-scripts,src=/scripts/,dst=/tmp/scripts/ \
+ --mount=type=cache,dst=/var/cache/rpm-ostree,id=rpm-ostree-cache-river-41,sharing=locked \
+ /tmp/scripts/run_module.sh 'gschema-overrides' '{"type":"gschema-overrides","include":["zz1-secureblue-theming.gschema.override"]}' \
+ && ostree container commit
+RUN \
+ --mount=type=bind,from=stage-files,src=/files,dst=/tmp/files,rw \
+ --mount=type=bind,from=stage-modules,src=/modules,dst=/tmp/modules,rw \
+ --mount=type=bind,from=ghcr.io/blue-build/cli:7c5578994e79d13d8780406600dc796422e22c8c-build-scripts,src=/scripts/,dst=/tmp/scripts/ \
+ --mount=type=cache,dst=/var/cache/rpm-ostree,id=rpm-ostree-cache-river-41,sharing=locked \
+ /tmp/scripts/run_module.sh 'script' '{"type":"script","scripts":["settheming.sh","addbrewjustimport.sh"]}' \
+ && ostree container commit
+RUN \
+ --mount=type=bind,from=stage-files,src=/files,dst=/tmp/files,rw \
+ --mount=type=bind,from=stage-modules,src=/modules,dst=/tmp/modules,rw \
+ --mount=type=bind,from=ghcr.io/blue-build/cli:7c5578994e79d13d8780406600dc796422e22c8c-build-scripts,src=/scripts/,dst=/tmp/scripts/ \
+ --mount=type=cache,dst=/var/cache/rpm-ostree,id=rpm-ostree-cache-river-41,sharing=locked \
+ /tmp/scripts/run_module.sh 'wayblue-signing' '{"type":"wayblue-signing"}' \
+ && ostree container commit
+RUN \
+ --mount=type=bind,from=stage-files,src=/files,dst=/tmp/files,rw \
+ --mount=type=bind,from=stage-modules,src=/modules,dst=/tmp/modules,rw \
+ --mount=type=bind,from=ghcr.io/blue-build/cli:7c5578994e79d13d8780406600dc796422e22c8c-build-scripts,src=/scripts/,dst=/tmp/scripts/ \
+ --mount=type=cache,dst=/var/cache/rpm-ostree,id=rpm-ostree-cache-river-41,sharing=locked \
+ /tmp/scripts/run_module.sh 'rpm-ostree' '{"type":"rpm-ostree","install":["river","waybar","xdg-desktop-portal-wlr","xdg-desktop-portal-gtk","foot","swaylock","swayidle"]}' \
+ && ostree container commit
+RUN \
+ --mount=type=bind,from=stage-files,src=/files,dst=/tmp/files,rw \
+ --mount=type=bind,from=stage-modules,src=/modules,dst=/tmp/modules,rw \
+ --mount=type=bind,from=ghcr.io/blue-build/cli:7c5578994e79d13d8780406600dc796422e22c8c-build-scripts,src=/scripts/,dst=/tmp/scripts/ \
+ --mount=type=cache,dst=/var/cache/rpm-ostree,id=rpm-ostree-cache-river-41,sharing=locked \
+ /tmp/scripts/run_module.sh 'files' '{"type":"files","files":[{"source":"system/river","destination":"/"}]}' \
+ && ostree container commit
+RUN \
+ --mount=type=bind,from=stage-files,src=/files,dst=/tmp/files,rw \
+ --mount=type=bind,from=stage-modules,src=/modules,dst=/tmp/modules,rw \
+ --mount=type=bind,from=ghcr.io/blue-build/cli:7c5578994e79d13d8780406600dc796422e22c8c-build-scripts,src=/scripts/,dst=/tmp/scripts/ \
+ --mount=type=cache,dst=/var/cache/rpm-ostree,id=rpm-ostree-cache-river-41,sharing=locked \
+ /tmp/scripts/run_module.sh 'script' '{"type":"script","scripts":["setriverwaybarmodules.sh"]}' \
+ && ostree container commit
+RUN \
+ --mount=type=bind,from=stage-files,src=/files,dst=/tmp/files,rw \
+ --mount=type=bind,from=stage-modules,src=/modules,dst=/tmp/modules,rw \
+ --mount=type=bind,from=ghcr.io/blue-build/cli:7c5578994e79d13d8780406600dc796422e22c8c-build-scripts,src=/scripts/,dst=/tmp/scripts/ \
+ --mount=type=cache,dst=/var/cache/rpm-ostree,id=rpm-ostree-cache-river-41,sharing=locked \
+ /tmp/scripts/run_module.sh 'script' '{"type":"script","scripts":["removeunusedrepos.sh","regenerateinitramfs.sh"]}' \
+ && ostree container commit
+
+RUN --mount=type=bind,from=ghcr.io/blue-build/cli:7c5578994e79d13d8780406600dc796422e22c8c-build-scripts,src=/scripts/,dst=/scripts/ \
+ /scripts/post_build.sh
+
+# Labels are added last since they cause cache misses with buildah
+LABEL org.blue-build.build-id="a3459c17-7a25-4df6-9c32-5578138f7870"
+LABEL org.opencontainers.image.title="river"
+LABEL org.opencontainers.image.description="ublue images for wayland compositors"
+LABEL org.opencontainers.image.source=""
+LABEL io.artifacthub.package.readme-url=https://raw.githubusercontent.com/blue-build/cli/main/README.md
diff --git a/ostree-images/river/files/gschema-overrides/zz1-secureblue-theming.gschema.override b/ostree-images/river/files/gschema-overrides/zz1-secureblue-theming.gschema.override
new file mode 100644
index 0000000..caa45e1
--- /dev/null
+++ b/ostree-images/river/files/gschema-overrides/zz1-secureblue-theming.gschema.override
@@ -0,0 +1,4 @@
+[org.gnome.desktop.interface]
+gtk-theme='Adwaita-dark'
+color-scheme='prefer-dark'
+icon-theme='Papirus'
\ No newline at end of file
diff --git a/ostree-images/river/files/scripts/addbrewjustimport.sh b/ostree-images/river/files/scripts/addbrewjustimport.sh
new file mode 100644
index 0000000..cad6d50
--- /dev/null
+++ b/ostree-images/river/files/scripts/addbrewjustimport.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+
+# Tell build process to exit if there are any errors.
+set -oue pipefail
+echo '
+
+import "/usr/share/ublue-os/just/50-brew.just"
+
+' >> /usr/share/ublue-os/justfile
diff --git a/ostree-images/river/files/scripts/addfirefoxdesktopfile.sh b/ostree-images/river/files/scripts/addfirefoxdesktopfile.sh
new file mode 100644
index 0000000..925fc05
--- /dev/null
+++ b/ostree-images/river/files/scripts/addfirefoxdesktopfile.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+
+# Tell build process to exit if there are any errors.
+set -oue pipefail
+
+sed -i 's/launcher_thunar = thunar.desktop/launcher_chromium = org.mozilla.firefox.desktop\nlauncher_thunar = thunar.desktop/' /usr/share/wayfire/wf-shell.ini
diff --git a/ostree-images/river/files/scripts/installandroidudev.sh b/ostree-images/river/files/scripts/installandroidudev.sh
new file mode 100644
index 0000000..ffc224f
--- /dev/null
+++ b/ostree-images/river/files/scripts/installandroidudev.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+# Tell build process to exit if there are any errors.
+set -oue pipefail
+
+curl -Lo /etc/yum.repos.d/_copr_ublue-os_staging.repo https://copr.fedorainfracloud.org/coprs/ublue-os/staging/repo/fedora-"${OS_VERSION}"/ublue-os-staging-fedora-"${OS_VERSION}".repo
+rpm-ostree install android-udev-rules
+rm /etc/yum.repos.d/_copr_ublue-os_staging.repo
\ No newline at end of file
diff --git a/ostree-images/river/files/scripts/installnvidiatoolkitpolicy.sh b/ostree-images/river/files/scripts/installnvidiatoolkitpolicy.sh
new file mode 100644
index 0000000..c55ff44
--- /dev/null
+++ b/ostree-images/river/files/scripts/installnvidiatoolkitpolicy.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+
+# Tell build process to exit if there are any errors.
+set -oue pipefail
+
+semodule --verbose --install /usr/share/selinux/packages/nvidia-container.pp
\ No newline at end of file
diff --git a/ostree-images/river/files/scripts/installproprietarypackages.sh b/ostree-images/river/files/scripts/installproprietarypackages.sh
new file mode 100644
index 0000000..075cbd4
--- /dev/null
+++ b/ostree-images/river/files/scripts/installproprietarypackages.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+
+# Tell build process to exit if there are any errors.
+set -oue pipefail
+
+curl -Lo /etc/yum.repos.d/negativo17-fedora-multimedia.repo https://negativo17.org/repos/fedora-multimedia.repo
+sed -i '0,/enabled=1/{s/enabled=1/enabled=1\npriority=90/}' /etc/yum.repos.d/negativo17-fedora-multimedia.repo
+
+rpm-ostree override replace \
+ --experimental \
+ --from repo='fedora-multimedia' \
+ libheif \
+ libva \
+ libva-intel-media-driver \
+ mesa-dri-drivers \
+ mesa-filesystem \
+ mesa-libEGL \
+ mesa-libGL \
+ mesa-libgbm \
+ mesa-libglapi \
+ mesa-libxatracker \
+ mesa-va-drivers \
+ mesa-vulkan-drivers \
+ gstreamer1-plugin-libav \
+ gstreamer1-plugin-vaapi
\ No newline at end of file
diff --git a/ostree-images/river/files/scripts/installrpmfusion.sh b/ostree-images/river/files/scripts/installrpmfusion.sh
new file mode 100644
index 0000000..08a3411
--- /dev/null
+++ b/ostree-images/river/files/scripts/installrpmfusion.sh
@@ -0,0 +1,3 @@
+ rpm-ostree install \
+ https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-${OS_VERSION}.noarch.rpm \
+ https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-${OS_VERSION}.noarch.rpm
\ No newline at end of file
diff --git a/ostree-images/river/files/scripts/installsignedkernel.sh b/ostree-images/river/files/scripts/installsignedkernel.sh
new file mode 100644
index 0000000..e6e5b8e
--- /dev/null
+++ b/ostree-images/river/files/scripts/installsignedkernel.sh
@@ -0,0 +1,31 @@
+#!/usr/bin/env bash
+
+# Tell build process to exit if there are any errors.
+set -oue pipefail
+
+find /tmp/rpms
+
+rpm-ostree cliwrap install-to-root /
+
+QUALIFIED_KERNEL="$(rpm -qa | grep -P 'kernel-(\d+\.\d+\.\d+)' | sed -E 's/kernel-//')"
+INCOMING_KERNEL_VERSION="$(basename -s .rpm $(ls /tmp/rpms/kernel/kernel-[0-9]*.rpm 2>/dev/null | grep -P 'kernel-(\d+\.\d+\.\d+)' | sed -E 's/kernel-//'))"
+
+echo "Qualified kernel: $QUALIFIED_KERNEL"
+echo "Incoming kernel version: $INCOMING_KERNEL_VERSION"
+
+
+if [[ "$INCOMING_KERNEL_VERSION" != "$QUALIFIED_KERNEL" ]]; then
+ echo "Installing kernel rpm from kernel-cache."
+ rpm-ostree override replace \
+ --experimental \
+ --install=zstd \
+ /tmp/rpms/kernel/kernel-[0-9]*.rpm \
+ /tmp/rpms/kernel/kernel-core-*.rpm \
+ /tmp/rpms/kernel/kernel-modules-*.rpm
+else
+ echo "Installing kernel files from kernel-cache."
+ cd /tmp
+ rpm2cpio /tmp/rpms/kernel/kernel-core-*.rpm | cpio -idmv
+ cp ./lib/modules/*/vmlinuz /usr/lib/modules/*/vmlinuz
+ cd /
+fi
\ No newline at end of file
diff --git a/ostree-images/river/files/scripts/regenerateinitramfs.sh b/ostree-images/river/files/scripts/regenerateinitramfs.sh
new file mode 100644
index 0000000..493804a
--- /dev/null
+++ b/ostree-images/river/files/scripts/regenerateinitramfs.sh
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+
+# Tell build process to exit if there are any errors.
+set -oue pipefail
+
+
+rpm-ostree cliwrap install-to-root /
+
+QUALIFIED_KERNEL="$(rpm -qa | grep -P 'kernel-(\d+\.\d+\.\d+)' | sed -E 's/kernel-//')"
+/usr/libexec/rpm-ostree/wrapped/dracut --no-hostonly --kver "$QUALIFIED_KERNEL" --reproducible -v --add ostree -f "/lib/modules/$QUALIFIED_KERNEL/initramfs.img"
+chmod 0600 "/lib/modules/$QUALIFIED_KERNEL/initramfs.img"
\ No newline at end of file
diff --git a/ostree-images/river/files/scripts/removegnomedesktopentries.sh b/ostree-images/river/files/scripts/removegnomedesktopentries.sh
new file mode 100644
index 0000000..ce76920
--- /dev/null
+++ b/ostree-images/river/files/scripts/removegnomedesktopentries.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+
+# Tell build process to exit if there are any errors.
+set -oue pipefail
+
+rm /usr/share/applications/org.gnome.ColorProfileViewer.desktop
+rm /usr/share/applications/org.gnome.Settings.desktop
+rm /usr/share/applications/org.gnome.Tecla.desktop
+rm /usr/share/applications/org.gnome.Tour.desktop
\ No newline at end of file
diff --git a/ostree-images/river/files/scripts/removeunprofessionalwallpapers.sh b/ostree-images/river/files/scripts/removeunprofessionalwallpapers.sh
new file mode 100644
index 0000000..5299c94
--- /dev/null
+++ b/ostree-images/river/files/scripts/removeunprofessionalwallpapers.sh
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+
+# Tell build process to exit if there are any errors.
+set -oue pipefail
+
+for file in /usr/share/hyprland/*.png; do
+ if [[ $file == *anime*.png || $file == wall2.png ]]; then
+ rm "$file"
+ echo "Removed: $file"
+ fi
+done
diff --git a/ostree-images/river/files/scripts/removeunusedrepos.sh b/ostree-images/river/files/scripts/removeunusedrepos.sh
new file mode 100644
index 0000000..7693d6c
--- /dev/null
+++ b/ostree-images/river/files/scripts/removeunusedrepos.sh
@@ -0,0 +1,10 @@
+#!/usr/bin/env bash
+
+# Tell build process to exit if there are any errors.
+set -oue pipefail
+
+rm -f /etc/yum.repos.d/negativo17-fedora-nvidia.repo
+rm -f /etc/yum.repos.d/negativo17-fedora-multimedia.repo
+rm -f /etc/yum.repos.d/eyecantcu-supergfxctl.repo
+rm -f /etc/yum.repos.d/_copr_ublue-os-akmods.repo
+rm -f /etc/yum.repos.d/nvidia-container-toolkit.repo
\ No newline at end of file
diff --git a/ostree-images/river/files/scripts/setdrmvariables.sh b/ostree-images/river/files/scripts/setdrmvariables.sh
new file mode 100644
index 0000000..617d940
--- /dev/null
+++ b/ostree-images/river/files/scripts/setdrmvariables.sh
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+
+# Tell build process to exit if there are any errors.
+set -oue pipefail
+
+
+echo '
+
+# Nvidia modesetting support. Set to 0 or comment to disable kernel modesetting
+# support. This must be disabled in case of SLI Mosaic.
+
+options nvidia-drm modeset=1 fbdev=1
+
+' > /usr/lib/modprobe.d/nvidia-modeset.conf
+
+cp /usr/lib/modprobe.d/nvidia-modeset.conf /etc/modprobe.d/nvidia-modeset.conf
\ No newline at end of file
diff --git a/ostree-images/river/files/scripts/setearlyloading.sh b/ostree-images/river/files/scripts/setearlyloading.sh
new file mode 100644
index 0000000..19ec951
--- /dev/null
+++ b/ostree-images/river/files/scripts/setearlyloading.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+
+# Tell build process to exit if there are any errors.
+set -oue pipefail
+
+sed -i 's@omit_drivers@force_drivers@g' /usr/lib/dracut/dracut.conf.d/99-nvidia.conf
+sed -i 's@ nvidia @ i915 amdgpu nvidia @g' /usr/lib/dracut/dracut.conf.d/99-nvidia.conf
diff --git a/ostree-images/river/files/scripts/sethyprlandwaybarmodules.sh b/ostree-images/river/files/scripts/sethyprlandwaybarmodules.sh
new file mode 100644
index 0000000..a450b49
--- /dev/null
+++ b/ostree-images/river/files/scripts/sethyprlandwaybarmodules.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+# Tell build process to exit if there are any errors.
+set -oue pipefail
+
+sed -i 's/sway\/workspaces/hyprland\/workspaces/' /etc/xdg/waybar/config.jsonc
+sed -i 's/sway\/mode/hyprland\/submap/' /etc/xdg/waybar/config.jsonc
+sed -i 's/sway\/window/hyprland\/window/' /etc/xdg/waybar/config.jsonc
diff --git a/ostree-images/river/files/scripts/setriverwaybarmodules.sh b/ostree-images/river/files/scripts/setriverwaybarmodules.sh
new file mode 100644
index 0000000..78d2458
--- /dev/null
+++ b/ostree-images/river/files/scripts/setriverwaybarmodules.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+# Tell build process to exit if there are any errors.
+set -oue pipefail
+
+sed -i 's/sway\/workspaces/river\/tags/' /etc/xdg/waybar/config.jsonc
+sed -i 's/sway\/mode/river\/mode/' /etc/xdg/waybar/config.jsonc
+sed -i 's/sway\/window/river\/window/' /etc/xdg/waybar/config.jsonc
diff --git a/ostree-images/river/files/scripts/setsddmtheming.sh b/ostree-images/river/files/scripts/setsddmtheming.sh
new file mode 100644
index 0000000..d48dc60
--- /dev/null
+++ b/ostree-images/river/files/scripts/setsddmtheming.sh
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+
+# Tell build process to exit if there are any errors.
+set -oue pipefail
+
+sed -i 's/color: "black"/color: "white"/' /usr/share/sddm/themes/maldives/Main.qml
+sed -i 's/id: lblPassword/id: lblPassword\ncolor: "white"/' /usr/share/sddm/themes/maldives/Main.qml
+sed -i 's/id: lblName/id: lblName\ncolor: "white"/' /usr/share/sddm/themes/maldives/Main.qml
+sed -i 's/id: lblSession/id: lblSession\ncolor: "white"/' /usr/share/sddm/themes/maldives/Main.qml
+sed -i 's/id: lblLayout/id: lblLayout\ncolor: "white"/' /usr/share/sddm/themes/maldives/Main.qml
+sed -i 's/id: errorMessage/id: errorMessage\ncolor: "white"/' /usr/share/sddm/themes/maldives/Main.qml
diff --git a/ostree-images/river/files/scripts/setswaynvidiaenvironment.sh b/ostree-images/river/files/scripts/setswaynvidiaenvironment.sh
new file mode 100644
index 0000000..ee79c37
--- /dev/null
+++ b/ostree-images/river/files/scripts/setswaynvidiaenvironment.sh
@@ -0,0 +1,38 @@
+#!/usr/bin/env bash
+
+# Tell build process to exit if there are any errors.
+set -oue pipefail
+
+rm /etc/sway/environment
+
+echo '
+
+# This file is a part of Fedora configuration for Sway and will be sourced
+# from /usr/bin/start-sway script for all users of the system.
+# User-specific variables should be placed in $XDG_CONFIG_HOME/sway/environment
+#
+# vim: set ft=sh:
+
+## Pass extra arguments to the /usr/bin/sway executable
+
+#SWAY_EXTRA_ARGS="$SWAY_EXTRA_ARGS --unsupported-gpu"
+SWAY_EXTRA_ARGS="$SWAY_EXTRA_ARGS --unsupported-gpu -D noscanout"
+#SWAY_EXTRA_ARGS="$SWAY_EXTRA_ARGS --debug"
+
+## Set environment variables
+
+# Useful variables for wlroots:
+# https://gitlab.freedesktop.org/wlroots/wlroots/-/blob/master/docs/env_vars.md
+WLR_NO_HARDWARE_CURSORS=1
+# Setting renderer to Vulkan may fix flickering but needs the following extensions:
+# - VK_EXT_image_drm_format_modifier
+# - VK_EXT_physical_device_drm
+#
+# Source: https://gitlab.freedesktop.org/wlroots/wlroots/-/commit/8e346922508aa3eaccd6e12f2917f6574f349843
+WLR_RENDERER=vulkan
+
+# Java Application compatibility
+# Source: https://github.com/swaywm/wlroots/issues/1464
+_JAVA_AWT_WM_NONREPARENTING=1
+
+' > /etc/sway/environment
\ No newline at end of file
diff --git a/ostree-images/river/files/scripts/settheming.sh b/ostree-images/river/files/scripts/settheming.sh
new file mode 100644
index 0000000..32d80c5
--- /dev/null
+++ b/ostree-images/river/files/scripts/settheming.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+
+# Tell build process to exit if there are any errors.
+set -oue pipefail
+
+# Removing this for now since it breaks steam layering.
+# https://github.com/ublue-os/bluefin/issues/1258
+# sed -i 's/Inherits=Adwaita/Inherits=Papirus/' /usr/share/icons/default/index.theme
diff --git a/ostree-images/river/files/scripts/setthunaricon.sh b/ostree-images/river/files/scripts/setthunaricon.sh
new file mode 100644
index 0000000..524e16c
--- /dev/null
+++ b/ostree-images/river/files/scripts/setthunaricon.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+
+# Tell build process to exit if there are any errors.
+set -oue pipefail
+
+sed -i 's/Icon=org.xfce.thunar/Icon=system-file-manager/' /usr/share/applications/thunar.desktop
diff --git a/ostree-images/river/files/system/etc/gdm/gdm-useradd b/ostree-images/river/files/system/etc/gdm/gdm-useradd
new file mode 100755
index 0000000..6a48f30
--- /dev/null
+++ b/ostree-images/river/files/system/etc/gdm/gdm-useradd
@@ -0,0 +1,4 @@
+#!/usr/bin/sh
+
+getent group gdm > /dev/null || groupadd -r gdm
+getent passwd gdm > /dev/null || useradd -r -g gdm -c "GDM Greeter Account" -d /var/lib/gdm -s /usr/sbin/nologin gdm
diff --git a/ostree-images/river/files/system/etc/polkit-1/rules.d/10-udisks2.rules b/ostree-images/river/files/system/etc/polkit-1/rules.d/10-udisks2.rules
new file mode 100644
index 0000000..86efcae
--- /dev/null
+++ b/ostree-images/river/files/system/etc/polkit-1/rules.d/10-udisks2.rules
@@ -0,0 +1,8 @@
+polkit.addRule(function(action, subject) {
+ if ((action.id == "org.freedesktop.udisks2.filesystem-mount-system" ||
+ action.id == "org.freedesktop.udisks2.filesystem-mount" ||
+ action.id == "org.freedesktop.udisks2.encrypted-unlock-system") &&
+ subject.isInGroup("wheel")) {
+ return polkit.Result.YES;
+ }
+});
\ No newline at end of file
diff --git a/ostree-images/river/files/system/etc/rofi.rasi b/ostree-images/river/files/system/etc/rofi.rasi
new file mode 100644
index 0000000..0c9a485
--- /dev/null
+++ b/ostree-images/river/files/system/etc/rofi.rasi
@@ -0,0 +1,133 @@
+/*Dracula theme based on the Purple official rofi theme*/
+
+configuration {
+ show-icons: true;
+ display-drun: "";
+ disable-history: false;
+}
+
+* {
+ font: "Jetbrains Mono 12";
+ foreground: #f8f8f2;
+ background-color: #282a36;
+ active-background: #6272a4;
+ urgent-background: #ff5555;
+ urgent-foreground: #282a36;
+ selected-background: @active-background;
+ selected-urgent-background: @urgent-background;
+ selected-active-background: @active-background;
+ separatorcolor: @active-background;
+ bordercolor: @active-background;
+}
+
+#window {
+ background-color: @background-color;
+ border: 3;
+ border-radius: 6;
+ border-color: @bordercolor;
+ padding: 15;
+}
+#mainbox {
+ border: 0;
+ padding: 0;
+}
+#message {
+ border: 0px;
+ border-color: @separatorcolor;
+ padding: 1px;
+}
+#textbox {
+ text-color: @foreground;
+}
+#listview {
+ fixed-height: 0;
+ border: 0px;
+ border-color: @bordercolor;
+ spacing: 2px ;
+ scrollbar: false;
+ padding: 2px 0px 0px ;
+}
+#element {
+ border: 0;
+ padding: 3px ;
+}
+#element.normal.normal {
+ background-color: @background-color;
+ text-color: @foreground;
+}
+#element.normal.urgent {
+ background-color: @urgent-background;
+ text-color: @urgent-foreground;
+}
+#element.normal.active {
+ background-color: @active-background;
+ text-color: @foreground;
+}
+#element.selected.normal {
+ background-color: @selected-background;
+ text-color: @foreground;
+}
+#element.selected.urgent {
+ background-color: @selected-urgent-background;
+ text-color: @foreground;
+}
+#element.selected.active {
+ background-color: @selected-active-background;
+ text-color: @foreground;
+}
+#element.alternate.normal {
+ background-color: @background-color;
+ text-color: @foreground;
+}
+#element.alternate.urgent {
+ background-color: @urgent-background;
+ text-color: @foreground;
+}
+#element.alternate.active {
+ background-color: @active-background;
+ text-color: @foreground;
+}
+#scrollbar {
+ width: 2px ;
+ border: 0;
+ handle-width: 8px ;
+ padding: 0;
+}
+#sidebar {
+ border: 2px dash 0px 0px ;
+ border-color: @separatorcolor;
+}
+#button.selected {
+ background-color: @selected-background;
+ text-color: @foreground;
+}
+#inputbar {
+ spacing: 0;
+ text-color: @foreground;
+ padding: 1px ;
+}
+#case-indicator {
+ spacing: 0;
+ text-color: @foreground;
+}
+#entry {
+ spacing: 0;
+ text-color: @foreground;
+}
+#prompt {
+ spacing: 0;
+ text-color: @foreground;
+}
+#inputbar {
+ children: [ prompt,textbox-prompt-colon,entry,case-indicator ];
+}
+#textbox-prompt-colon {
+ expand: false;
+ str: ">";
+ margin: 0px 0.3em 0em 0em ;
+ text-color: @foreground;
+}
+element-text, element-icon {
+ background-color: inherit;
+ text-color: inherit;
+}
diff --git a/ostree-images/river/files/system/etc/sddm.conf.d/theme.conf b/ostree-images/river/files/system/etc/sddm.conf.d/theme.conf
new file mode 100644
index 0000000..1007848
--- /dev/null
+++ b/ostree-images/river/files/system/etc/sddm.conf.d/theme.conf
@@ -0,0 +1,2 @@
+[Theme]
+Current=maldives
\ No newline at end of file
diff --git a/ostree-images/river/files/system/etc/sddm/sddm-useradd b/ostree-images/river/files/system/etc/sddm/sddm-useradd
new file mode 100755
index 0000000..e44f640
--- /dev/null
+++ b/ostree-images/river/files/system/etc/sddm/sddm-useradd
@@ -0,0 +1,4 @@
+#!/usr/bin/sh
+
+getent group sddm > /dev/null || groupadd -r sddm
+getent passwd sddm > /dev/null || useradd -r -g sddm -c "SDDM Greeter Account" -d /var/lib/sddm -s /usr/sbin/nologin sddm
diff --git a/ostree-images/river/files/system/etc/swaylock/config b/ostree-images/river/files/system/etc/swaylock/config
new file mode 100644
index 0000000..ec2afc7
--- /dev/null
+++ b/ostree-images/river/files/system/etc/swaylock/config
@@ -0,0 +1,7 @@
+# The defaults below could be overridden in $XDG_CONFIG_HOME/swaylock/config
+# (~/.config/swaylock/config).
+#
+# Image path supports environment variables and shell expansions,
+# e.g. image=$HOME/Pictures/default.png
+image=/usr/share/backgrounds/default.png
+scaling=fill
diff --git a/ostree-images/river/files/system/etc/xdg/waybar/config.jsonc b/ostree-images/river/files/system/etc/xdg/waybar/config.jsonc
new file mode 100644
index 0000000..e9c31cc
--- /dev/null
+++ b/ostree-images/river/files/system/etc/xdg/waybar/config.jsonc
@@ -0,0 +1,134 @@
+// -*- mode: jsonc -*-
+{
+ "layer": "top", // Waybar at top layer
+ // "position": "bottom", // Waybar position (top|bottom|left|right)
+ "height": 30, // Waybar height (to be removed for auto height)
+ // "width": 1280, // Waybar width
+ "spacing": 4, // Gaps between modules (4px)
+ // Choose the order of the modules
+ "modules-left": [
+ "sway/workspaces",
+ "sway/mode",
+ "sway/scratchpad"
+ ],
+ "modules-center": [
+ "sway/window"
+ ],
+ "modules-right": [
+ "idle_inhibitor",
+ "pulseaudio",
+ "network",
+ "power-profiles-daemon",
+ "cpu",
+ "memory",
+ "temperature",
+ "backlight",
+ "battery",
+ "clock",
+ "tray"
+ ],
+ // Modules configuration
+ "sway/mode": {
+ "format": "{}"
+ },
+ "sway/scratchpad": {
+ "format": "{icon} {count}",
+ "show-empty": false,
+ "format-icons": ["", ""],
+ "tooltip": true,
+ "tooltip-format": "{app}: {title}"
+ },
+ "idle_inhibitor": {
+ "format": "{icon}",
+ "format-icons": {
+ "activated": "",
+ "deactivated": ""
+ }
+ },
+ "tray": {
+ // "icon-size": 21,
+ "spacing": 5
+ },
+ "clock": {
+ // "timezone": "America/New_York",
+ "tooltip-format": "{:%Y %B}\n{calendar}",
+ "format-alt": "{:%Y-%m-%d}"
+ },
+ "cpu": {
+ "format": "{usage}% ",
+ "tooltip": false
+ },
+ "memory": {
+ "format": "{}% "
+ },
+ "temperature": {
+ // "thermal-zone": 2,
+ // "hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input",
+ "critical-threshold": 80,
+ // "format-critical": "{temperatureC}°C {icon}",
+ "format": "{temperatureC}°C {icon}",
+ "format-icons": ["", "", ""]
+ },
+ "backlight": {
+ // "device": "acpi_video1",
+ "format": "{percent}% {icon}",
+ "format-icons": ["🌑", "🌘", "🌗", "🌖", "🌕"]
+ },
+ "battery": {
+ "states": {
+ // "good": 95,
+ "warning": 30,
+ "critical": 15
+ },
+ "format": "{capacity}% {icon}",
+ "format-full": "{capacity}% {icon}",
+ "format-charging": "{capacity}% ",
+ "format-plugged": "{capacity}% ",
+ "format-alt": "{time} {icon}",
+ // "format-good": "", // An empty format will hide the module
+ // "format-full": "",
+ "format-icons": ["", "", "", "", ""]
+ },
+ "battery#bat2": {
+ "bat": "BAT2"
+ },
+ "power-profiles-daemon": {
+ "format": "{icon}",
+ "tooltip-format": "Power profile: {profile}\nDriver: {driver}",
+ "tooltip": true,
+ "format-icons": {
+ "default": "",
+ "performance": "",
+ "balanced": "",
+ "power-saver": ""
+ }
+ },
+ "network": {
+ // "interface": "wlp2*", // (Optional) To force the use of this interface
+ "format-wifi": "{essid} ({signalStrength}%) ",
+ "format-ethernet": "{ipaddr}/{cidr} ",
+ "tooltip-format": "{ifname} via {gwaddr} ",
+ "format-linked": "{ifname} (No IP) ",
+ "format-disconnected": "Disconnected ⚠",
+ "format-alt": "{ifname}: {ipaddr}/{cidr}"
+ },
+ "pulseaudio": {
+ // "scroll-step": 1, // %, can be a float
+ "format": "{volume}% {icon} {format_source}",
+ "format-bluetooth": "{volume}% {icon} {format_source}",
+ "format-bluetooth-muted": " {icon} {format_source}",
+ "format-muted": " {format_source}",
+ "format-source": "{volume}% ",
+ "format-source-muted": "",
+ "format-icons": {
+ "headphone": "",
+ "hands-free": "",
+ "headset": "",
+ "phone": "",
+ "portable": "",
+ "car": "",
+ "default": ["", "", ""]
+ },
+ "on-click": "pavucontrol"
+ }
+}
diff --git a/ostree-images/river/files/system/etc/xdg/waybar/style.css b/ostree-images/river/files/system/etc/xdg/waybar/style.css
new file mode 100644
index 0000000..f69653c
--- /dev/null
+++ b/ostree-images/river/files/system/etc/xdg/waybar/style.css
@@ -0,0 +1,286 @@
+* {
+ font-family: 'Noto Sans Mono', 'Font Awesome 6 Free', 'Font Awesome 6 Brands', monospace;
+ font-size: 13px;
+}
+
+@define-color inactive_module_color #a9a9a9;
+
+window#waybar {
+ background-color: rgba(43, 48, 59, 0.8);
+ border-color: rgba(100, 114, 125, 0.5);
+ border-style: solid;
+ color: #ffffff;
+ transition-property: background-color;
+ transition-duration: .5s;
+}
+
+window#waybar:not(.bottom):not(.left):not(.right) {
+ border-bottom-width: 2px;
+}
+
+window#waybar.bottom {
+ border-top-width: 2px;
+}
+
+window#waybar.hidden {
+ opacity: 0.2;
+}
+
+button {
+ /* reset all builtin/theme styles */
+ all: unset;
+ /* Restore some properties */
+ min-height: 24px;
+ min-width: 16px;
+ padding: 0 10px;
+ transition: all 200ms ease-out;
+}
+
+/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */
+button:hover {
+ background: inherit;
+}
+
+window#waybar:not(.bottom):not(.left):not(.right) button:hover{
+ box-shadow: inset 0 -2px;
+}
+
+window#waybar.bottom button:hover {
+ box-shadow: inset 0 2px;
+}
+
+/*
+ * Common module rules
+ */
+
+.modules-left > widget > label,
+.modules-center > widget > label,
+.modules-right > widget > label {
+ color: inherit;
+ margin: 0;
+ padding: 0 10px;
+}
+
+.modules-left > widget > box,
+.modules-center > widget > box,
+.modules-right > widget > box {
+ color: inherit;
+ margin: 0;
+ padding: 0;
+}
+
+/* If the leftmost module is a box, omit left margin and padding */
+.modules-left > widget:first-child > box {
+ margin-left: 0;
+ padding-left: 0;
+}
+
+/* If the rightmost module is a box, omit right margin and padding */
+.modules-right > widget:last-child > box {
+ margin-right: 0;
+ padding-right: 0;
+}
+
+
+/*
+ * Draw module underlines
+ */
+window#waybar:not(.bottom):not(.left):not(.right) .modules-left > widget > label,
+window#waybar:not(.bottom):not(.left):not(.right) .modules-center > widget > label,
+window#waybar:not(.bottom):not(.left):not(.right) .modules-right > widget > label {
+ box-shadow: inset 0 -2px;
+}
+
+window#waybar.bottom .modules-left > widget > label,
+window#waybar.bottom .modules-center > widget > label,
+window#waybar.bottom .modules-right > widget > label {
+ box-shadow: inset 0 2px;
+}
+
+window#waybar #window {
+ box-shadow: none;
+}
+
+#workspaces button {
+ background-color: transparent;
+ color: #ffffff;
+}
+
+#workspaces button:hover {
+ background: rgba(0, 0, 0, 0.2);
+}
+
+#workspaces button.focused {
+ background-color: #64727D;
+}
+
+window#waybar:not(.bottom):not(.left):not(.right) #workspaces button.focused {
+ box-shadow: inset 0 -2px;
+}
+
+window#waybar.bottom #workspaces button.focused {
+ box-shadow: inset 0 2px;
+}
+
+#workspaces button.urgent {
+ background-color: #eb4d4b;
+}
+
+#mode {
+ background-color: #64727D;
+}
+
+window#waybar:not(.bottom):not(.left):not(.right) #mode {
+ box-shadow: inset 0 -2px;
+}
+
+window#waybar.bottom #mode {
+ box-shadow: inset 0 2px;
+}
+
+#image {
+ margin: 0;
+ padding: 0 10px;
+}
+
+#battery.charging, #battery.plugged {
+ color: #32cd32;
+}
+
+@keyframes blink {
+ to {
+ background-color: #ffffff;
+ color: #000000;
+ }
+}
+
+#battery.critical:not(.charging) {
+ color: #f53c3c;
+ animation-name: blink;
+ animation-duration: 0.5s;
+ animation-timing-function: linear;
+ animation-iteration-count: infinite;
+ animation-direction: alternate;
+}
+
+#network.disconnected,
+#pulseaudio.muted,
+#wireplumber.muted {
+ color: @inactive_module_color;
+}
+
+#tray {
+ padding: 0 5px;
+}
+
+#tray > .passive {
+ -gtk-icon-effect: dim;
+}
+
+@keyframes needs-attention {
+ to {
+ background-color: rgba(235, 77, 75, 0.5);
+ }
+}
+
+#tray > .needs-attention {
+ -gtk-icon-effect: highlight;
+ animation-name: needs-attention;
+ animation-duration: 1s;
+ animation-timing-function: linear;
+ animation-iteration-count: infinite;
+ animation-direction: alternate;
+ background-color: transparent;
+}
+
+#idle_inhibitor {
+ color: @inactive_module_color;
+}
+
+#idle_inhibitor.activated {
+ color: inherit;
+}
+
+#mpd.disconnected,
+#mpd.paused,
+#mpd.stopped {
+ color: @inactive_module_color;
+}
+
+#cpu.high,
+#temperature.critical {
+ color: #eb4d4b;
+}
+
+#language {
+ min-width: 16px;
+}
+
+#keyboard-state {
+ min-width: 16px;
+}
+
+#keyboard-state > label {
+ padding: 0 5px;
+}
+
+#keyboard-state > label.locked {
+ background: rgba(0, 0, 0, 0.2);
+}
+
+#scratchpad {
+ background: rgba(0, 0, 0, 0.2);
+}
+
+#scratchpad.empty {
+ background-color: transparent;
+}
+
+
+/*
+ * Module colors
+ */
+#cpu {
+ color: #2ecc71;
+}
+
+#memory {
+ color: #ba55d3;
+}
+
+#disk {
+ color: #964B00;
+}
+
+#backlight {
+ color: #90b1b1;
+}
+
+#network {
+ color: #00bfff;
+}
+
+#pulseaudio,
+#wireplumber {
+ color: #f1c40f;
+}
+
+#temperature {
+ color: #f0932b;
+}
+
+#mpd {
+ color: #66cc99;
+}
+
+#mpd.paused {
+ color: #51a37a;
+}
+
+#language {
+ color: #00b093;
+}
+
+#keyboard-state {
+ color: #97e1ad;
+}
\ No newline at end of file
diff --git a/ostree-images/river/files/system/etc/xdg/waybar/waybar_config_source.txt b/ostree-images/river/files/system/etc/xdg/waybar/waybar_config_source.txt
new file mode 100644
index 0000000..09a2308
--- /dev/null
+++ b/ostree-images/river/files/system/etc/xdg/waybar/waybar_config_source.txt
@@ -0,0 +1 @@
+https://gitlab.com/fedora/sigs/sway/sway-config-fedora/-/merge_requests/25
\ No newline at end of file
diff --git a/ostree-images/river/files/system/hyprland/etc/environment b/ostree-images/river/files/system/hyprland/etc/environment
new file mode 100644
index 0000000..600c6f6
--- /dev/null
+++ b/ostree-images/river/files/system/hyprland/etc/environment
@@ -0,0 +1,2 @@
+GTK_THEME=Adwaita:dark
+QT_STYLE_OVERRIDE=adwaita-dark
diff --git a/ostree-images/river/files/system/hyprland/etc/skel/.config/xfce4/helpers.rc b/ostree-images/river/files/system/hyprland/etc/skel/.config/xfce4/helpers.rc
new file mode 100644
index 0000000..5226528
--- /dev/null
+++ b/ostree-images/river/files/system/hyprland/etc/skel/.config/xfce4/helpers.rc
@@ -0,0 +1 @@
+TerminalEmulator=kitty
diff --git a/ostree-images/river/files/system/hyprland/etc/xdg/hypr/hypridle.conf b/ostree-images/river/files/system/hyprland/etc/xdg/hypr/hypridle.conf
new file mode 100644
index 0000000..88ae37a
--- /dev/null
+++ b/ostree-images/river/files/system/hyprland/etc/xdg/hypr/hypridle.conf
@@ -0,0 +1,34 @@
+general {
+ lock_cmd = pidof hyprlock || hyprlock # avoid starting multiple hyprlock instances.
+ before_sleep_cmd = loginctl lock-session # lock before suspend.
+ after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display.
+}
+
+listener {
+ timeout = 150 # 2.5min.
+ on-timeout = brightnessctl -s set 10 # set monitor backlight to minimum, avoid 0 on OLED monitor.
+ on-resume = brightnessctl -r # monitor backlight restore.
+}
+
+# turn off keyboard backlight, comment out this section if you dont have a keyboard backlight.
+listener {
+ timeout = 150 # 2.5min.
+ on-timeout = brightnessctl -sd rgb:kbd_backlight set 0 # turn off keyboard backlight.
+ on-resume = brightnessctl -rd rgb:kbd_backlight # turn on keyboard backlight.
+}
+
+listener {
+ timeout = 300 # 5min
+ on-timeout = loginctl lock-session # lock screen when timeout has passed
+}
+
+listener {
+ timeout = 330 # 5.5min
+ on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed
+ on-resume = hyprctl dispatch dpms on # screen on when activity is detected after timeout has fired.
+}
+
+listener {
+ timeout = 1800 # 30min
+ on-timeout = systemctl suspend # suspend pc
+}
\ No newline at end of file
diff --git a/ostree-images/river/files/system/hyprland/etc/xdg/hypr/hyprlock.conf b/ostree-images/river/files/system/hyprland/etc/xdg/hypr/hyprlock.conf
new file mode 100644
index 0000000..fefeff8
--- /dev/null
+++ b/ostree-images/river/files/system/hyprland/etc/xdg/hypr/hyprlock.conf
@@ -0,0 +1,12 @@
+widget_name {
+ monitor =
+}
+
+background {
+ monitor =
+ path = /usr/share/backgrounds/default.png
+}
+
+input-field {
+ monitor =
+}
\ No newline at end of file
diff --git a/ostree-images/river/files/system/hyprland/usr/bin/starthyprland b/ostree-images/river/files/system/hyprland/usr/bin/starthyprland
new file mode 100755
index 0000000..8f71ef3
--- /dev/null
+++ b/ostree-images/river/files/system/hyprland/usr/bin/starthyprland
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+
+# Tell this script to exit if there are any errors.
+# You should have this in every custom script, to ensure that your completed
+# builds actually ran successfully without any errors!
+set -oue pipefail
+
+
+hyprland_conf="$HOME/.config/hypr/hyprland.conf"
+default_conf="/usr/share/hyprland/hyprland.conf"
+
+if [ -f "$hyprland_conf" ]; then
+ Hyprland -c "$hyprland_conf"
+else
+ Hyprland -c "$default_conf"
+fi
\ No newline at end of file
diff --git a/ostree-images/river/files/system/hyprland/usr/share/hyprland/hyprland.conf b/ostree-images/river/files/system/hyprland/usr/share/hyprland/hyprland.conf
new file mode 100644
index 0000000..f7d68c2
--- /dev/null
+++ b/ostree-images/river/files/system/hyprland/usr/share/hyprland/hyprland.conf
@@ -0,0 +1,195 @@
+
+autogenerated = 0
+# See https://wiki.hyprland.org/Configuring/Monitors/
+monitor=,preferred,auto,1
+
+
+# See https://wiki.hyprland.org/Configuring/Keywords/ for more
+
+# Source a file (multi-file configs)
+# source = ~/.config/hypr/myColors.conf
+
+# Some default env vars.
+env = XCURSOR_SIZE,24
+env = GTK_THEME,Adwaita:dark
+env = QT_STYLE_OVERRIDE,adwaita-dark
+
+cursor {
+ no_hardware_cursors = true
+}
+
+# For all categories, see https://wiki.hyprland.org/Configuring/Variables/
+input {
+ kb_layout = us
+ kb_variant =
+ kb_model =
+ kb_options =
+ kb_rules =
+
+ follow_mouse = 1
+
+ touchpad {
+ natural_scroll = no
+ }
+
+ sensitivity = 0 # -1.0 - 1.0, 0 means no modification.
+}
+
+general {
+ # See https://wiki.hyprland.org/Configuring/Variables/ for more
+
+ gaps_in = 4
+ gaps_out = 4
+ border_size = 2
+ col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
+ col.inactive_border = rgba(595959aa)
+
+ layout = dwindle
+
+ # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on
+ allow_tearing = false
+}
+
+decoration {
+ # See https://wiki.hyprland.org/Configuring/Variables/ for more
+
+ rounding = 10
+
+ blur {
+ enabled = true
+ size = 3
+ passes = 1
+ }
+
+ drop_shadow = yes
+ shadow_range = 4
+ shadow_render_power = 3
+ col.shadow = rgba(1a1a1aee)
+}
+
+animations {
+ enabled = yes
+
+ # Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more
+
+ bezier = myBezier, 0.05, 0.9, 0.1, 1.05
+
+ animation = windows, 1, 7, myBezier
+ animation = windowsOut, 1, 7, default, popin 80%
+ animation = border, 1, 10, default
+ animation = borderangle, 1, 8, default
+ animation = fade, 1, 7, default
+ animation = workspaces, 1, 6, default
+}
+
+dwindle {
+ # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more
+ pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below
+ preserve_split = yes # you probably want this
+}
+
+master {
+ # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more
+ new_status = master
+}
+
+gestures {
+ # See https://wiki.hyprland.org/Configuring/Variables/ for more
+ workspace_swipe = off
+}
+
+misc {
+ # See https://wiki.hyprland.org/Configuring/Variables/ for more
+ force_default_wallpaper = 0 # Set to 0 to disable the anime mascot wallpapers
+ disable_splash_rendering = true
+}
+
+# See https://wiki.hyprland.org/Configuring/Keywords/ for more
+$mainMod = SUPER
+
+$lockCommand = hyprlock
+
+# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more
+bind = $mainMod, Q, exec, kitty
+bind = $mainMod, C, killactive,
+bind = $mainMod, M, exit,
+bind = $mainMod, E, exec, thunar
+bind = $mainMod, V, togglefloating,
+bind = $mainMod, R, exec, rofi -show drun
+bind = $mainMod, P, pseudo, # dwindle
+bind = $mainMod, J, togglesplit, # dwindle
+bind = $mainMod, L, exec, $lockCommand
+bind = $mainMod, F, fullscreen
+
+# Move focus with mainMod + arrow keys
+bind = $mainMod, left, movefocus, l
+bind = $mainMod, right, movefocus, r
+bind = $mainMod, up, movefocus, u
+bind = $mainMod, down, movefocus, d
+
+# Switch workspaces with mainMod + [0-9]
+bind = $mainMod, 1, workspace, 1
+bind = $mainMod, 2, workspace, 2
+bind = $mainMod, 3, workspace, 3
+bind = $mainMod, 4, workspace, 4
+bind = $mainMod, 5, workspace, 5
+bind = $mainMod, 6, workspace, 6
+bind = $mainMod, 7, workspace, 7
+bind = $mainMod, 8, workspace, 8
+bind = $mainMod, 9, workspace, 9
+bind = $mainMod, 0, workspace, 10
+
+# Move active window to a workspace with mainMod + SHIFT + [0-9]
+bind = $mainMod SHIFT, 1, movetoworkspace, 1
+bind = $mainMod SHIFT, 2, movetoworkspace, 2
+bind = $mainMod SHIFT, 3, movetoworkspace, 3
+bind = $mainMod SHIFT, 4, movetoworkspace, 4
+bind = $mainMod SHIFT, 5, movetoworkspace, 5
+bind = $mainMod SHIFT, 6, movetoworkspace, 6
+bind = $mainMod SHIFT, 7, movetoworkspace, 7
+bind = $mainMod SHIFT, 8, movetoworkspace, 8
+bind = $mainMod SHIFT, 9, movetoworkspace, 9
+bind = $mainMod SHIFT, 0, movetoworkspace, 10
+
+# screenshot
+bind = , Print, exec, grim -g "$(slurp -d)" - | wl-copy
+
+# Volume and Media Control
+bind = , XF86AudioRaiseVolume, exec, pamixer -i 5
+bind = , XF86AudioLowerVolume, exec, pamixer -d 5
+bind = , XF86AudioMicMute, exec, pamixer --default-source -m
+bind = , XF86AudioMute, exec, pamixer -t
+bind = , XF86AudioPlay, exec, playerctl play-pause
+bind = , XF86AudioPause, exec, playerctl play-pause
+bind = , XF86AudioNext, exec, playerctl next
+bind = , XF86AudioPrev, exec, playerctl previous
+
+# Screen brightness
+bind = , XF86MonBrightnessUp, exec, brightnessctl s +5%
+bind = , XF86MonBrightnessDown, exec, brightnessctl s 5%-
+
+# Keyboard backlight
+bind = , xf86KbdBrightnessUp, exec, brightnessctl -d *::kbd_backlight set +33%
+bind = , xf86KbdBrightnessDown, exec, brightnessctl -d *::kbd_backlight set 33%-
+
+# Example special workspace (scratchpad)
+bind = $mainMod, S, togglespecialworkspace, magic
+bind = $mainMod SHIFT, S, movetoworkspace, special:magic
+
+# Scroll through existing workspaces with mainMod + scroll
+bind = $mainMod, mouse_down, workspace, e+1
+bind = $mainMod, mouse_up, workspace, e-1
+
+# Move/resize windows with mainMod + LMB/RMB and dragging
+bindm = $mainMod, mouse:272, movewindow
+bindm = $mainMod, mouse:273, resizewindow
+
+
+exec-once = /usr/libexec/xdg-desktop-portal-hyprland
+exec-once = /usr/libexec/xdg-desktop-portal-gtk
+exec-once = /usr/libexec/xdg-desktop-portal
+exec-once = dbus-update-activation-environment --all
+exec-once = /usr/bin/gnome-keyring-daemon --start --components=secrets
+exec-once = exec /usr/libexec/pam_kwallet_init
+exec-once = waybar & /usr/libexec/xfce-polkit & dunst & nm-applet
+exec-once = hypridle -c /etc/xdg/hypr/hypridle.conf
diff --git a/ostree-images/river/files/system/hyprland/usr/share/wayland-sessions/hyprland.desktop b/ostree-images/river/files/system/hyprland/usr/share/wayland-sessions/hyprland.desktop
new file mode 100644
index 0000000..bb824cb
--- /dev/null
+++ b/ostree-images/river/files/system/hyprland/usr/share/wayland-sessions/hyprland.desktop
@@ -0,0 +1,5 @@
+[Desktop Entry]
+Name=Hyprland
+Comment=An intelligent dynamic tiling Wayland compositor
+Exec=/usr/bin/starthyprland
+Type=Application
\ No newline at end of file
diff --git a/ostree-images/river/files/system/river/etc/environment b/ostree-images/river/files/system/river/etc/environment
new file mode 100644
index 0000000..600c6f6
--- /dev/null
+++ b/ostree-images/river/files/system/river/etc/environment
@@ -0,0 +1,2 @@
+GTK_THEME=Adwaita:dark
+QT_STYLE_OVERRIDE=adwaita-dark
diff --git a/ostree-images/river/files/system/river/etc/river/init b/ostree-images/river/files/system/river/etc/river/init
new file mode 100755
index 0000000..11b8970
--- /dev/null
+++ b/ostree-images/river/files/system/river/etc/river/init
@@ -0,0 +1,184 @@
+#!/bin/sh
+
+# This is the example configuration file for river.
+#
+# If you wish to edit this, you will probably want to copy it to
+# $XDG_CONFIG_HOME/river/init or $HOME/.config/river/init first.
+#
+# See the river(1), riverctl(1), and rivertile(1) man pages for complete
+# documentation.
+
+# Note: the "Super" modifier is also known as Logo, GUI, Windows, Mod4, etc.
+
+# Super+Shift+Return to start an instance of foot
+riverctl map normal Super+Shift Return spawn foot
+
+# launcher
+riverctl map normal Super D spawn "rofi -show drun"
+
+# Super+Q to close the focused view
+riverctl map normal Super Q close
+
+# Super+Shift+E to exit river
+riverctl map normal Super+Shift E exit
+
+# Super+J and Super+K to focus the next/previous view in the layout stack
+riverctl map normal Super J focus-view next
+riverctl map normal Super K focus-view previous
+
+# Super+Shift+J and Super+Shift+K to swap the focused view with the next/previous
+# view in the layout stack
+riverctl map normal Super+Shift J swap next
+riverctl map normal Super+Shift K swap previous
+
+# Super+Period and Super+Comma to focus the next/previous output
+riverctl map normal Super Period focus-output next
+riverctl map normal Super Comma focus-output previous
+
+# Super+Shift+{Period,Comma} to send the focused view to the next/previous output
+riverctl map normal Super+Shift Period send-to-output next
+riverctl map normal Super+Shift Comma send-to-output previous
+
+# Super+Return to bump the focused view to the top of the layout stack
+riverctl map normal Super Return zoom
+
+# Super+H and Super+L to decrease/increase the main ratio of rivertile(1)
+riverctl map normal Super H send-layout-cmd rivertile "main-ratio -0.05"
+riverctl map normal Super L send-layout-cmd rivertile "main-ratio +0.05"
+
+# Super+Shift+H and Super+Shift+L to increment/decrement the main count of rivertile(1)
+riverctl map normal Super+Shift H send-layout-cmd rivertile "main-count +1"
+riverctl map normal Super+Shift L send-layout-cmd rivertile "main-count -1"
+
+# Super+Alt+{H,J,K,L} to move views
+riverctl map normal Super+Alt H move left 100
+riverctl map normal Super+Alt J move down 100
+riverctl map normal Super+Alt K move up 100
+riverctl map normal Super+Alt L move right 100
+
+# Super+Alt+Control+{H,J,K,L} to snap views to screen edges
+riverctl map normal Super+Alt+Control H snap left
+riverctl map normal Super+Alt+Control J snap down
+riverctl map normal Super+Alt+Control K snap up
+riverctl map normal Super+Alt+Control L snap right
+
+# Super+Alt+Shift+{H,J,K,L} to resize views
+riverctl map normal Super+Alt+Shift H resize horizontal -100
+riverctl map normal Super+Alt+Shift J resize vertical 100
+riverctl map normal Super+Alt+Shift K resize vertical -100
+riverctl map normal Super+Alt+Shift L resize horizontal 100
+
+# Super + Left Mouse Button to move views
+riverctl map-pointer normal Super BTN_LEFT move-view
+
+# Super + Right Mouse Button to resize views
+riverctl map-pointer normal Super BTN_RIGHT resize-view
+
+# Super + Middle Mouse Button to toggle float
+riverctl map-pointer normal Super BTN_MIDDLE toggle-float
+
+for i in $(seq 1 9)
+do
+ tags=$((1 << ($i - 1)))
+
+ # Super+[1-9] to focus tag [0-8]
+ riverctl map normal Super $i set-focused-tags $tags
+
+ # Super+Shift+[1-9] to tag focused view with tag [0-8]
+ riverctl map normal Super+Shift $i set-view-tags $tags
+
+ # Super+Control+[1-9] to toggle focus of tag [0-8]
+ riverctl map normal Super+Control $i toggle-focused-tags $tags
+
+ # Super+Shift+Control+[1-9] to toggle tag [0-8] of focused view
+ riverctl map normal Super+Shift+Control $i toggle-view-tags $tags
+done
+
+# Super+0 to focus all tags
+# Super+Shift+0 to tag focused view with all tags
+all_tags=$(((1 << 32) - 1))
+riverctl map normal Super 0 set-focused-tags $all_tags
+riverctl map normal Super+Shift 0 set-view-tags $all_tags
+
+# Super+Space to toggle float
+riverctl map normal Super Space toggle-float
+
+# Super+F to toggle fullscreen
+riverctl map normal Super F toggle-fullscreen
+
+# Super+{Up,Right,Down,Left} to change layout orientation
+riverctl map normal Super Up send-layout-cmd rivertile "main-location top"
+riverctl map normal Super Right send-layout-cmd rivertile "main-location right"
+riverctl map normal Super Down send-layout-cmd rivertile "main-location bottom"
+riverctl map normal Super Left send-layout-cmd rivertile "main-location left"
+
+# Declare a passthrough mode. This mode has only a single mapping to return to
+# normal mode. This makes it useful for testing a nested wayland compositor
+riverctl declare-mode passthrough
+
+# Super+F11 to enter passthrough mode
+riverctl map normal Super F11 enter-mode passthrough
+
+# Super+F11 to return to normal mode
+riverctl map passthrough Super F11 enter-mode normal
+
+# Various media key mapping examples for both normal and locked mode which do
+# not have a modifier
+for mode in normal locked
+do
+ # Eject the optical drive (well if you still have one that is)
+ riverctl map $mode None XF86Eject spawn 'eject -T'
+
+ # Control pulse audio volume with pamixer (https://github.com/cdemoulins/pamixer)
+ riverctl map $mode None XF86AudioRaiseVolume spawn 'pamixer -i 5'
+ riverctl map $mode None XF86AudioLowerVolume spawn 'pamixer -d 5'
+ riverctl map $mode None XF86AudioMute spawn 'pamixer --toggle-mute'
+
+ # Control MPRIS aware media players with playerctl (https://github.com/altdesktop/playerctl)
+ riverctl map $mode None XF86AudioMedia spawn 'playerctl play-pause'
+ riverctl map $mode None XF86AudioPlay spawn 'playerctl play-pause'
+ riverctl map $mode None XF86AudioPrev spawn 'playerctl previous'
+ riverctl map $mode None XF86AudioNext spawn 'playerctl next'
+
+ riverctl map $mode None XF86MonBrightnessUp spawn 'brightnessctl s +5%'
+ riverctl map $mode None XF86MonBrightnessDown spawn 'brightnessctl s 5%-'
+done
+
+# Set background and border color
+riverctl background-color 0x002b36
+riverctl border-color-focused 0x93a1a1
+riverctl border-color-unfocused 0x586e75
+
+# Set keyboard repeat rate
+riverctl set-repeat 50 300
+
+# Make all views with an app-id that starts with "float" and title "foo" start floating.
+riverctl rule-add -app-id 'float*' -title 'foo' float
+
+# Make all views with app-id "bar" and any title use client-side decorations
+riverctl rule-add -app-id "bar" csd
+
+# Set the default layout generator to be rivertile and start it.
+# River will send the process group of the init executable SIGTERM on exit.
+riverctl default-layout rivertile
+rivertile -view-padding 2 -outer-padding 2 &
+
+riverctl focus-follows-cursor always
+
+riverctl map normal Super Escape spawn "swaylock -f"
+
+riverctl map normal None Print spawn 'grim -g "$(slurp -d)" - | wl-copy'
+
+riverctl spawn dunst
+riverctl spawn pipewire
+riverctl spawn pipewire-pulse
+riverctl spawn wireplumber
+riverctl spawn "/usr/libexec/xfce-polkit"
+riverctl spawn waybar
+riverctl spawn kanshi
+riverctl spawn nm-applet
+
+exec dbus-update-activation-environment --all
+exec gnome-keyring-daemon --start --components=secrets
+exec /usr/libexec/pam_kwallet_init
+
diff --git a/ostree-images/river/files/system/river/etc/skel/.config/xfce4/helpers.rc b/ostree-images/river/files/system/river/etc/skel/.config/xfce4/helpers.rc
new file mode 100644
index 0000000..e074ab8
--- /dev/null
+++ b/ostree-images/river/files/system/river/etc/skel/.config/xfce4/helpers.rc
@@ -0,0 +1 @@
+TerminalEmulator=foot
diff --git a/ostree-images/river/files/system/river/usr/bin/startriver b/ostree-images/river/files/system/river/usr/bin/startriver
new file mode 100755
index 0000000..4ce906c
--- /dev/null
+++ b/ostree-images/river/files/system/river/usr/bin/startriver
@@ -0,0 +1,15 @@
+#!/usr/bin/env bash
+
+# Tell this script to exit if there are any errors.
+# You should have this in every custom script, to ensure that your completed
+# builds actually ran successfully without any errors!
+set -oue pipefail
+
+
+river_conf="$HOME/.config/river/init"
+
+if [ -f "$river_conf" ]; then
+ river
+else
+ XDG_CONFIG_HOME=/usr/etc/ river
+fi
diff --git a/ostree-images/river/files/system/river/usr/share/wayland-sessions/river.desktop b/ostree-images/river/files/system/river/usr/share/wayland-sessions/river.desktop
new file mode 100644
index 0000000..701171f
--- /dev/null
+++ b/ostree-images/river/files/system/river/usr/share/wayland-sessions/river.desktop
@@ -0,0 +1,6 @@
+[Desktop Entry]
+Name=River
+Comment=A dynamic tiling wayland compositor
+DesktopNames=river
+Exec=/usr/bin/startriver
+Type=Application
diff --git a/ostree-images/river/files/system/sway/etc/skel/.config/xfce4/helpers.rc b/ostree-images/river/files/system/sway/etc/skel/.config/xfce4/helpers.rc
new file mode 100644
index 0000000..e074ab8
--- /dev/null
+++ b/ostree-images/river/files/system/sway/etc/skel/.config/xfce4/helpers.rc
@@ -0,0 +1 @@
+TerminalEmulator=foot
diff --git a/ostree-images/river/files/system/sway/etc/sway/config.d/90-keyring.conf b/ostree-images/river/files/system/sway/etc/sway/config.d/90-keyring.conf
new file mode 100644
index 0000000..d1759b7
--- /dev/null
+++ b/ostree-images/river/files/system/sway/etc/sway/config.d/90-keyring.conf
@@ -0,0 +1,3 @@
+exec dbus-update-activation-environment --all
+exec /usr/bin/gnome-keyring-daemon --start --components=secrets
+exec /usr/libexec/pam_kwallet_init
diff --git a/ostree-images/river/files/system/sway/etc/sway/config.d/99-taptoclick.conf b/ostree-images/river/files/system/sway/etc/sway/config.d/99-taptoclick.conf
new file mode 100644
index 0000000..7dd212a
--- /dev/null
+++ b/ostree-images/river/files/system/sway/etc/sway/config.d/99-taptoclick.conf
@@ -0,0 +1,3 @@
+input * {
+ tap enabled
+}
\ No newline at end of file
diff --git a/ostree-images/river/files/system/usr/share/sddm/themes/maldives/background.jpg b/ostree-images/river/files/system/usr/share/sddm/themes/maldives/background.jpg
new file mode 100644
index 0000000..5df9316
Binary files /dev/null and b/ostree-images/river/files/system/usr/share/sddm/themes/maldives/background.jpg differ
diff --git a/ostree-images/river/files/system/usr/share/sddm/themes/maldives/rectangle.png b/ostree-images/river/files/system/usr/share/sddm/themes/maldives/rectangle.png
new file mode 100644
index 0000000..909a9eb
Binary files /dev/null and b/ostree-images/river/files/system/usr/share/sddm/themes/maldives/rectangle.png differ
diff --git a/ostree-images/river/files/system/usr/share/ublue-os/just/50-brew.just b/ostree-images/river/files/system/usr/share/ublue-os/just/50-brew.just
new file mode 100644
index 0000000..af36147
--- /dev/null
+++ b/ostree-images/river/files/system/usr/share/ublue-os/just/50-brew.just
@@ -0,0 +1,24 @@
+alias brew := install-brew
+
+# Install Homebrew | https://brew.sh
+install-brew:
+ #!/usr/bin/env bash
+ source /usr/lib/ujust/ujust.sh
+ if [[ ! -f "/var/home/linuxbrew/.linuxbrew/bin" || ! -x "/var/home/linuxbrew/.linuxbrew/bin/brew" ]]; then
+ echo "${b}Brew Installation${n}"
+ echo "Please ${b}IGNORE${n} everything the installer tells you to do at the end"
+ echo "We have already done it for you! You just need to close and re-open the terminal after installation"
+ echo "Do you understand?"
+ echo "Please type in \"YES I UNDERSTAND\" and press enter"
+ read ACCEPT
+ if [ "$ACCEPT" == "YES I UNDERSTAND" ]; then
+ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
+ else
+ echo "Capitalization matters when you type \"YES I UNDERSTAND\""
+ fi
+ fi
+
+# Removes homebrew from system
+remove-brew:
+ echo "Removing homebrew ..."
+ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
\ No newline at end of file
diff --git a/ostree-images/river/files/system/wayfire/etc/environment b/ostree-images/river/files/system/wayfire/etc/environment
new file mode 100644
index 0000000..5d30cfc
--- /dev/null
+++ b/ostree-images/river/files/system/wayfire/etc/environment
@@ -0,0 +1,3 @@
+WAYFIRE_CONFIG_FILE=/usr/share/wayfire/wayfire.ini
+GTK_THEME=Adwaita:dark
+QT_STYLE_OVERRIDE=adwaita-dark
diff --git a/ostree-images/river/files/system/wayfire/etc/skel/.config/xfce4/helpers.rc b/ostree-images/river/files/system/wayfire/etc/skel/.config/xfce4/helpers.rc
new file mode 100644
index 0000000..e074ab8
--- /dev/null
+++ b/ostree-images/river/files/system/wayfire/etc/skel/.config/xfce4/helpers.rc
@@ -0,0 +1 @@
+TerminalEmulator=foot
diff --git a/ostree-images/river/files/system/wayfire/usr/bin/startwayfire b/ostree-images/river/files/system/wayfire/usr/bin/startwayfire
new file mode 100755
index 0000000..2faf625
--- /dev/null
+++ b/ostree-images/river/files/system/wayfire/usr/bin/startwayfire
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+
+# Tell this script to exit if there are any errors.
+# You should have this in every custom script, to ensure that your completed
+# builds actually ran successfully without any errors!
+set -oue pipefail
+
+
+wayfire_conf="$HOME/.config/wayfire.ini"
+default_conf="/usr/share/wayfire/wayfire.ini"
+
+if [ -f "$wayfire_conf" ]; then
+ wayfire -c "$wayfire_conf"
+else
+ wayfire -c "$default_conf"
+fi
\ No newline at end of file
diff --git a/ostree-images/river/files/system/wayfire/usr/share/wayfire/wayfire.ini b/ostree-images/river/files/system/wayfire/usr/share/wayfire/wayfire.ini
new file mode 100644
index 0000000..ca4abc8
--- /dev/null
+++ b/ostree-images/river/files/system/wayfire/usr/share/wayfire/wayfire.ini
@@ -0,0 +1,332 @@
+# Default config for Wayfire
+#
+# Copy this to ~/.config/wayfire.ini and edit it to your liking.
+#
+# Take the tutorial to get started.
+# https://github.com/WayfireWM/wayfire/wiki/Tutorial
+#
+# Read the Configuration document for a complete reference.
+# https://github.com/WayfireWM/wayfire/wiki/Configuration
+
+# Input configuration ──────────────────────────────────────────────────────────
+
+# Example configuration:
+#
+# [input]
+# xkb_layout = us,fr
+# xkb_variant = dvorak,bepo
+# xkb_options = grp:win_space_toggle
+#
+# See Input options for a complete reference.
+# https://github.com/WayfireWM/wayfire/wiki/Configuration#input
+
+# Output configuration ─────────────────────────────────────────────────────────
+
+# Example configuration:
+#
+# [output:eDP-1]
+# mode = 1920x1080@60000
+# position = 0,0
+# transform = normal
+# scale = 1.000000
+#
+# You can get the names of your outputs with wlr-randr.
+# https://github.com/emersion/wlr-randr
+#
+# See also kanshi for configuring your outputs automatically.
+# https://wayland.emersion.fr/kanshi/
+#
+# See Output options for a complete reference.
+# https://github.com/WayfireWM/wayfire/wiki/Configuration#output
+
+# Core options ─────────────────────────────────────────────────────────────────
+
+[core]
+
+# List of plugins to be enabled.
+# See the Configuration document for a complete list.
+plugins = \
+ alpha \
+ animate \
+ autostart \
+ command \
+ cube \
+ decoration \
+ expo \
+ fast-switcher \
+ fisheye \
+ foreign-toplevel \
+ grid \
+ gtk-shell \
+ idle \
+ invert \
+ move \
+ oswitch \
+ place \
+ resize \
+ shortcuts-inhibit \
+ switcher \
+ vswitch \
+ wayfire-shell \
+ window-rules \
+ wm-actions \
+ wobbly \
+ wrot \
+ zoom
+
+# Note: [blur] is not enabled by default, because it can be resource-intensive.
+# Feel free to add it to the list if you want it.
+# You can find its documentation here:
+# https://github.com/WayfireWM/wayfire/wiki/Configuration#blur
+
+# Close focused window.
+close_top_view = KEY_Q | KEY_F4
+
+# Workspaces arranged into a grid: 3 × 3.
+vwidth = 3
+vheight = 3
+
+# Prefer client-side decoration or server-side decoration
+preferred_decoration_mode = client
+
+# Mouse bindings ───────────────────────────────────────────────────────────────
+
+# Drag windows by holding down Super and left mouse button.
+[move]
+activate = BTN_LEFT
+
+# Resize them with right mouse button + Super.
+[resize]
+activate = BTN_RIGHT
+
+# Zoom in the desktop by scrolling + Super.
+[zoom]
+modifier =
+
+# Change opacity by scrolling with Super + Alt.
+[alpha]
+modifier =
+
+# Rotate windows with the mouse.
+[wrot]
+activate = BTN_RIGHT
+
+# Fisheye effect.
+[fisheye]
+toggle = KEY_F
+
+# Startup commands ─────────────────────────────────────────────────────────────
+
+[autostart]
+
+# Automatically start background and panel.
+# Set to false if you want to override the default clients.
+autostart_wf_shell = false
+background = wf-background -c /usr/share/wayfire/wf-shell.ini
+panel = wf-panel -c /usr/share/wayfire/wf-shell.ini
+
+# Set the wallpaper, start a panel and dock if you want one.
+# https://github.com/WayfireWM/wf-shell
+#
+# These are started by the autostart_wf_shell option above.
+#
+# background = wf-background
+# panel = wf-panel
+# dock = wf-dock
+
+# Output configuration
+# https://wayland.emersion.fr/kanshi/
+outputs = kanshi
+
+# Notifications
+notifications = dunst
+
+# Screen color temperature
+# https://sr.ht/~kennylevinsen/wlsunset/
+gamma = wlsunset
+
+# Idle configuration
+# https://github.com/swaywm/swayidle
+# https://github.com/swaywm/swaylock
+idle = swayidle before-sleep 'swaylock'
+
+# XDG desktop portal
+# Needed by some GTK applications
+portal = /usr/libexec/xdg-desktop-portal-gtk
+
+polkit = /usr/libexec/xfce-polkit
+
+GTK_Theme=adw-gtk3-dark
+GDK_BACKEND=wayland
+
+nm_applet = nm-applet --indicator
+bt_applet = blueman-applet
+
+0_environment = dbus-update-activation-environment --systemd WAYLAND_DISPLAY DISPLAY XAUTHORITY
+keyring = /usr/bin/gnome-keyring-daemon --start --components=secrets
+kwallet = exec /usr/libexec/pam_kwallet_init
+
+# Example configuration:
+#
+# [idle]
+# toggle = KEY_Z
+# screensaver_timeout = 300
+# dpms_timeout = 600
+#
+# Disables the compositor going idle with Super + z.
+# This will lock your screen after 300 seconds of inactivity, then turn off
+# your displays after another 300 seconds.
+
+# Applications ─────────────────────────────────────────────────────────────────
+
+[command]
+
+# Start a terminal
+# https://github.com/alacritty/alacritty
+binding_terminal = KEY_ENTER
+command_terminal = foot
+
+# Start your launcher
+binding_launcher = KEY_ENTER
+command_launcher = rofi -show drun
+
+# Screen locker
+# https://github.com/swaywm/swaylock
+binding_lock = KEY_ESC
+command_lock = swaylock
+
+# Logout
+# https://github.com/ArtsyMacaw/wlogout
+binding_logout = KEY_ESC
+command_logout = wlogout
+
+# Screenshots
+# https://wayland.emersion.fr/grim/
+# https://wayland.emersion.fr/slurp/
+binding_screenshot = KEY_PRINT
+command_screenshot = grim $(date '+%F_%T').webp
+binding_screenshot_interactive = KEY_PRINT
+command_screenshot_interactive = slurp | grim -g - $(date '+%F_%T').webp
+
+# Volume controls
+# https://alsa-project.org
+repeatable_binding_volume_up = KEY_VOLUMEUP
+command_volume_up = amixer set Master 5%+
+repeatable_binding_volume_down = KEY_VOLUMEDOWN
+command_volume_down = amixer set Master 5%-
+binding_mute = KEY_MUTE
+command_mute = amixer set Master toggle
+
+# Screen brightness
+repeatable_binding_light_up = KEY_BRIGHTNESSUP
+command_light_up = brightnessctl s +5%
+repeatable_binding_light_down = KEY_BRIGHTNESSDOWN
+command_light_down = brightnessctl s 5%-
+
+# Windows ──────────────────────────────────────────────────────────────────────
+
+# Actions related to window management functionalities.
+#
+# Example configuration:
+#
+# [wm-actions]
+# toggle_fullscreen = KEY_F
+# toggle_always_on_top = KEY_X
+# toggle_sticky = KEY_X
+
+# Position the windows in certain regions of the output.
+[grid]
+#
+# ⇱ ↑ ⇲ │ 7 8 9
+# ← f → │ 4 5 6
+# ⇱ ↓ ⇲ d │ 1 2 3 0
+# ‾ ‾
+slot_bl = KEY_KP1
+slot_b = KEY_KP2
+slot_br = KEY_KP3
+slot_l = KEY_LEFT | KEY_KP4
+slot_c = KEY_UP | KEY_KP5
+slot_r = KEY_RIGHT | KEY_KP6
+slot_tl = KEY_KP7
+slot_t = KEY_KP8
+slot_tr = KEY_KP9
+# Restore default.
+restore = KEY_DOWN | KEY_KP0
+
+# Change active window with an animation.
+[switcher]
+next_view = KEY_TAB
+prev_view = KEY_TAB
+
+# Simple active window switcher.
+[fast-switcher]
+activate = KEY_ESC
+
+# Workspaces ───────────────────────────────────────────────────────────────────
+
+# Switch to workspace.
+[vswitch]
+binding_left = KEY_LEFT
+binding_down = KEY_DOWN
+binding_up = KEY_UP
+binding_right = KEY_RIGHT
+# Move the focused window with the same key-bindings, but add Shift.
+with_win_left = KEY_LEFT
+with_win_down = KEY_DOWN
+with_win_up = KEY_UP
+with_win_right = KEY_RIGHT
+
+# Show the current workspace row as a cube.
+[cube]
+activate = BTN_LEFT
+# Switch to the next or previous workspace.
+#rotate_left = KEY_H
+#rotate_right = KEY_L
+
+# Show an overview of all workspaces.
+[expo]
+toggle =
+# Select a workspace.
+# Workspaces are arranged into a grid of 3 × 3.
+# The numbering is left to right, line by line.
+#
+# ⇱ k ⇲
+# h ⏎ l
+# ⇱ j ⇲
+# ‾ ‾
+# See core.vwidth and core.vheight for configuring the grid.
+select_workspace_1 = KEY_1
+select_workspace_2 = KEY_2
+select_workspace_3 = KEY_3
+select_workspace_4 = KEY_4
+select_workspace_5 = KEY_5
+select_workspace_6 = KEY_6
+select_workspace_7 = KEY_7
+select_workspace_8 = KEY_8
+select_workspace_9 = KEY_9
+
+# Outputs ──────────────────────────────────────────────────────────────────────
+
+# Change focused output.
+[oswitch]
+# Switch to the next output.
+next_output = KEY_O
+# Same with the window.
+next_output_with_win = KEY_O
+
+# Invert the colors of the whole output.
+[invert]
+toggle = KEY_I
+
+# Rules ────────────────────────────────────────────────────────────────────────
+
+# Example configuration:
+#
+# [window-rules]
+# maximize_alacritty = on created if app_id is "Alacritty" then maximize
+#
+# You can get the properties of your applications with the following command:
+# $ WAYLAND_DEBUG=1 alacritty 2>&1 | kak
+#
+# See Window rules for a complete reference.
+# https://github.com/WayfireWM/wayfire/wiki/Configuration#window-rules
diff --git a/ostree-images/river/files/system/wayfire/usr/share/wayfire/wf-shell.ini b/ostree-images/river/files/system/wayfire/usr/share/wayfire/wf-shell.ini
new file mode 100644
index 0000000..3d89c7f
--- /dev/null
+++ b/ostree-images/river/files/system/wayfire/usr/share/wayfire/wf-shell.ini
@@ -0,0 +1,175 @@
+[background]
+# Full path to image or directory of images
+# image = /usr/share/wayfire/wallpaper.jpg
+# Whether to scale images or preserve background ratio
+preserve_aspect = 0
+# In the case of directory, timeout between changing backgrounds, in seconds
+cycle_timeout = 150
+# In the case of directory, whether or not to randomize images
+randomize = 0
+
+[panel]
+# widgets_* is a space-separated list of widgets to be displayed
+# at the corresponding part of the panel
+# Supported widgets are: launchers clock network battery window-list volume menu notifications tray command-output
+# A special widgets is spacing widgets, it can be used to add padding everywhere on the panel
+# To use it, just append the amount of pixels you want as a padding
+# to the word "spacing" and use it as a plugin
+widgets_left = menu window-list
+widgets_center = launchers
+widgets_right = notifications volume battery tray clock
+
+# The minimal size of the panel. Note that some widgets might force panel bigger than this size.
+# All widgets also have individual settings for size
+# Changing this requires a panel restart
+minimal_height = 24
+
+# automatically hide when pointer isn't over the panel
+autohide = false
+
+# time in milliseconds to wait before hiding
+autohide_duration = 300
+
+# layer can be top, bottom, overlay or background
+layer = top
+
+# where to position panel
+# Possible values are only "top" and "bottom"
+position = bottom
+
+# set the background color.
+background_color = gtk_headerbar # match the color of a GtkHeaderbar
+#background_color = $555555 # Hex color, for example $FFFFFF for white
+#background_color = 0.033 0.041 0.047 0.9 # RGBA color, 1.0 0.0 0.0 0.5 for semi-transparent red
+
+
+# Configuration for the launchers widget
+# can be a desktop file
+launcher_terminal1 = foot.desktop
+
+# or a combination of bash command + icon
+# launcher_cmd_1 = env XDG_CURRENT_DESKTOP=GNOME gnome-control-center
+# launcher_icon_1 = /usr/share/icons/gnome/48x48/categories/preferences-system.png
+
+launcher_thunar = thunar.desktop
+launcher_wcm = wayfire-config-manager.desktop
+
+# spacing between widgets, can be negative
+launchers_spacing = 4
+
+# size of the launcher icon
+launchers_size = 42
+
+
+# Configuration for the clock widget
+# clock format, uses the Glib Time formatting
+clock_format = %e %a %H:%M
+# clock font
+clock_font = DejaVu Sans:style=Book 12
+
+
+# Configuration for the battery widget
+# How much info to display:
+# 0 -> only icon, 1 -> icon + percentage, 2 -> full info
+battery_status = 1
+battery_icon_size = 32
+
+# invert the colors of the icon, needs to be adjusted according to the size of the icons,
+# because some icon sizes are white, and others are black
+battery_icon_invert = 1
+
+# Font to use in the battery percentage indicator
+battery_font = default
+
+
+# Configuration for the network widget
+# Whether to display connection details, for ex. Wifi AP name
+network_status = 1
+
+network_status_font = DejaVu Sans:style=Book 10
+# network_icon_size = 30
+network_icon_invert_color = 1
+
+# whether to colour the wifi signal strength
+network_status_use_color = yes
+
+
+# Configuration for the menu widget
+# whether to enable fuzzy search in the menu
+menu_fuzzy_search = 1
+
+# Minimum width and height for the contents of the menu.
+# Can be useful for small screens and/or high DPI scaling.
+menu_min_content_width = 500
+menu_min_content_height = 500
+
+# image file to use as the menu icon
+menu_icon = /usr/share/icons/Paper/32x32/places/fedora.png
+
+# command run when the logout button is clicked
+menu_logout_command =
+
+
+# Configuration for the volume widget
+# Number of seconds volume popover will display
+# after scrolling on the volume icon
+volume_display_timeout = 2.5
+
+
+# Configuration for the tray widget
+# Amount of smooth scrolling needed to trigger one scroll wheel step
+tray_smooth_scrolling_threshold = 5
+
+# The icon size to use for tray icons
+tray_icon_size = 32
+
+# Enable showing of the tray menu when using middle-click, otherwise, right-click is used
+tray_menu_on_middle_click = false
+
+
+# Configuration for the notifications widget
+notifications_autohide_timeout = 2.5
+
+# Show criticial notifications in do-not-disturb mode, which is triggered by middle-clicking the DND button.
+notifications_critical_in_dnd = true
+notifications_icon_size = 32
+
+
+# Configuration for the command output widget, there may be multiple commands.
+# The command output widget is used to display the output of a shell command, which can be periodically refreshed.
+# For example, showing the current CPU temperature by parsing `sensors` output (command may need adjustment for your particular sensor name!)
+
+# Maximum amount of characters to show in the panel, if the command's output is too long
+commands_output_max_chars = 10
+
+# A list of commands + attributes, multiple commands can be declared after one another. The commands are numbered 1, 2, 3, etc.
+
+# The command to be run, uncomment and adapt according to the output of sensors on your system
+#command_output_1 = sensors | grep Package | cut -d ' ' -f 5
+
+# A command which is run and whose output is displayed in a tooltip when hovering the widget
+#command_output_tooltip_1 = sensors
+
+# Refresh the output of the command ever 1s. Can be set to -1 for manual updates with the mouse, or 0 for a single update at startup.
+# command_output_period_1 = 1
+
+# Optionally, an icon can be displayed next to the text. Leave empty (first option) for no icon.
+# command_output_icon_1 =
+# command_output_icon_1 = text-x-script
+
+# Position and size for the icon, if it is not empty
+#command_output_icon_size_1 = 32
+#command_output_icon_position_1 = left # or right, top, bottom
+
+[dock]
+# time in milliseconds to wait before hiding
+autohide_duration = 300
+
+# vertical alignment on the desktop
+# the only possible values are "top" and "bottom"
+position = bottom
+
+# For applications that aren't installed/configured properly, you can manually
+# set icons for given app_id's. Below is an example for IntelliJ IDEA
+# icon_mapping_jetbrains-idea-ce = //idea.png
+
diff --git a/ostree-images/river/files/system/wayfire/usr/share/wayland-sessions/wayfire.desktop b/ostree-images/river/files/system/wayfire/usr/share/wayland-sessions/wayfire.desktop
new file mode 100644
index 0000000..59d4d89
--- /dev/null
+++ b/ostree-images/river/files/system/wayfire/usr/share/wayland-sessions/wayfire.desktop
@@ -0,0 +1,6 @@
+[Desktop Entry]
+Name=Wayfire
+Exec=/usr/bin/startwayfire
+Icon=
+Type=Application
+DesktopNames=Wayfire
diff --git a/ostree-images/river/files/systemd/system/gdm-boot.service b/ostree-images/river/files/systemd/system/gdm-boot.service
new file mode 100644
index 0000000..8c147ea
--- /dev/null
+++ b/ostree-images/river/files/systemd/system/gdm-boot.service
@@ -0,0 +1,16 @@
+# Creates an GDM user before GDM runs.
+# See:
+# - https://github.com/ublue-os/cinnamon/blob/bf44562ddbed670cdd0d03a45ea08bdb8a6e96a7/system_files/usr/lib/systemd/system/ublue-lightdm-workaround.service#L4
+# - https://github.com/ublue-os/main/issues/224#issuecomment-1987851271
+
+[Unit]
+Description=Create GDM user on system boot
+Before=gdm.service
+
+[Service]
+Type=oneshot
+ExecStart=/usr/etc/gdm/gdm-useradd
+RemainAfterExit=yes
+
+[Install]
+WantedBy=multi-user.target
diff --git a/ostree-images/river/files/systemd/system/sddm-boot.service b/ostree-images/river/files/systemd/system/sddm-boot.service
new file mode 100644
index 0000000..4436e18
--- /dev/null
+++ b/ostree-images/river/files/systemd/system/sddm-boot.service
@@ -0,0 +1,16 @@
+# Creates an SDDM user before SDDM runs.
+# See:
+# - https://github.com/ublue-os/cinnamon/blob/bf44562ddbed670cdd0d03a45ea08bdb8a6e96a7/system_files/usr/lib/systemd/system/ublue-lightdm-workaround.service#L4
+# - https://github.com/ublue-os/main/issues/224#issuecomment-1987851271
+
+[Unit]
+Description=Create SDDM user on system boot
+Before=sddm.service
+
+[Service]
+Type=oneshot
+ExecStart=/usr/etc/sddm/sddm-useradd
+RemainAfterExit=yes
+
+[Install]
+WantedBy=multi-user.target
diff --git a/ostree-images/river/modules/wayblue-signing/module.yml b/ostree-images/river/modules/wayblue-signing/module.yml
new file mode 100644
index 0000000..b234261
--- /dev/null
+++ b/ostree-images/river/modules/wayblue-signing/module.yml
@@ -0,0 +1,4 @@
+name: wayblue-signing
+shortdesc: The signing module is used to install the required signing policies for cosign image verification with rpm-ostree and bootc.
+example: |
+ type: wayblue-signing # this sets up the proper policy & signing files for signed images to work fully
\ No newline at end of file
diff --git a/ostree-images/river/modules/wayblue-signing/policy.json b/ostree-images/river/modules/wayblue-signing/policy.json
new file mode 100644
index 0000000..3b3ed88
--- /dev/null
+++ b/ostree-images/river/modules/wayblue-signing/policy.json
@@ -0,0 +1,25 @@
+{
+ "default": [
+ {
+ "type": "reject"
+ }
+ ],
+ "transports": {
+ "docker": {
+ "registry.access.redhat.com": [
+ {
+ "type": "signedBy",
+ "keyType": "GPGKeys",
+ "keyPath": "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release"
+ }
+ ],
+ "registry.redhat.io": [
+ {
+ "type": "signedBy",
+ "keyType": "GPGKeys",
+ "keyPath": "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release"
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/ostree-images/river/modules/wayblue-signing/registry-config.yml b/ostree-images/river/modules/wayblue-signing/registry-config.yml
new file mode 100644
index 0000000..a6f4927
--- /dev/null
+++ b/ostree-images/river/modules/wayblue-signing/registry-config.yml
@@ -0,0 +1,3 @@
+docker:
+ ghcr.io/IMAGENAME:
+ use-sigstore-attachments: true
\ No newline at end of file
diff --git a/ostree-images/river/modules/wayblue-signing/wayblue-signing.sh b/ostree-images/river/modules/wayblue-signing/wayblue-signing.sh
new file mode 100644
index 0000000..1ec9de0
--- /dev/null
+++ b/ostree-images/river/modules/wayblue-signing/wayblue-signing.sh
@@ -0,0 +1,48 @@
+#!/usr/bin/env bash
+
+# Tell build process to exit if there are any errors.
+set -euo pipefail
+
+CONTAINER_DIR="/usr/etc/containers"
+MODULE_DIRECTORY="${MODULE_DIRECTORY:-"/tmp/modules"}"
+IMAGE_NAME_FILE="${IMAGE_NAME//\//_}"
+IMAGE_REGISTRY_TITLE=$(echo "$IMAGE_REGISTRY" | cut -d'/' -f2-)
+
+echo "Setting up container signing in policy.json and cosign.yaml for $IMAGE_NAME"
+echo "Registry to write: $IMAGE_REGISTRY"
+
+if ! [ -d "$CONTAINER_DIR" ]; then
+ mkdir -p "$CONTAINER_DIR"
+fi
+
+if ! [ -d $CONTAINER_DIR/registries.d ]; then
+ mkdir -p "$CONTAINER_DIR/registries.d"
+fi
+
+if ! [ -d "/usr/etc/pki/containers" ]; then
+ mkdir -p "/usr/etc/pki/containers"
+fi
+
+if ! [ -f "$CONTAINER_DIR/policy.json" ]; then
+ cp "$MODULE_DIRECTORY/signing/policy.json" "$CONTAINER_DIR/policy.json"
+fi
+
+mv "/usr/etc/pki/containers/$IMAGE_NAME.pub" "/usr/etc/pki/containers/$IMAGE_REGISTRY_TITLE.pub"
+
+POLICY_FILE="$CONTAINER_DIR/policy.json"
+
+yq -i -o=j '.transports.docker |=
+ {"'"$IMAGE_REGISTRY"'": [
+ {
+ "type": "sigstoreSigned",
+ "keyPath": "/usr/etc/pki/containers/'"$IMAGE_REGISTRY_TITLE"'.pub",
+ "signedIdentity": {
+ "type": "matchRepository"
+ }
+ }
+ ]
+ }
++ .' "$POLICY_FILE"
+
+mv "$MODULE_DIRECTORY/signing/registry-config.yaml" "$CONTAINER_DIR/registries.d/$IMAGE_REGISTRY_TITLE.yaml"
+sed -i "s ghcr.io/IMAGENAME $IMAGE_REGISTRY g" "$CONTAINER_DIR/registries.d/$IMAGE_REGISTRY_TITLE.yaml"