├── output └── .gitkeep ├── rootfs ├── etc │ ├── locale.conf │ ├── skel │ │ └── Templates │ │ │ ├── Empty file │ │ │ ├── Text file.txt │ │ │ └── Configuration file.conf │ ├── dconf │ │ ├── profile │ │ │ └── user │ │ └── db │ │ │ └── local.d │ │ │ ├── 01-dark-theme │ │ │ └── 01-background │ ├── resolv.conf │ ├── systemd │ │ ├── logind.conf.d │ │ │ └── power_off.conf │ │ ├── journald.conf.d │ │ │ ├── 00-journal-size.conf │ │ │ └── 00-journal-persistent.conf │ │ └── system │ │ │ ├── bluetooth-workaround.service │ │ │ ├── home-swapfile.swap │ │ │ └── swapfile.service │ ├── xdg │ │ └── gtk-3.0 │ │ │ └── settings.ini │ ├── NetworkManager │ │ └── conf.d │ │ │ └── 00-disable-rand-mac.conf │ ├── lightdm │ │ ├── lightdm.conf.d │ │ │ └── 10-chimeraos-session.conf │ │ └── lightdm.conf │ ├── udev │ │ └── rules.d │ │ │ ├── 00-ntfs3-default-mount.rules │ │ │ └── 81-wol.rules │ ├── sudoers.d │ │ └── systemctl_needed │ ├── mkinitcpio.conf │ ├── initcpio │ │ ├── install │ │ │ └── frzr-etc │ │ └── hooks │ │ │ └── frzr-etc │ ├── bluetooth │ │ └── main.conf │ ├── vconsole.conf │ ├── locale.gen │ ├── polkit-1 │ │ └── rules.d │ │ │ ├── 41-steamvr.rules │ │ │ └── 40-system-tweaks.rules │ └── pacman.conf ├── usr │ ├── lib │ │ ├── firmware │ │ │ ├── aw87xxx_acf_air1s.bin │ │ │ ├── aw87xxx_acf_airplus.bin │ │ │ └── awinic_smartk_acf.bin │ │ ├── libFLAC.so.12 │ │ ├── frzr.d │ │ │ ├── bootconfig.conf │ │ │ ├── swap-fix.migration │ │ │ ├── remove-extraneous-wireplumber-config.migration │ │ │ └── systemd-boot.migration │ │ ├── os-branch-select │ │ └── os-session-select │ ├── share │ │ ├── wayland-sessions │ │ │ ├── steamos.desktop │ │ │ └── gnome-session-oneshot.desktop │ │ ├── icons │ │ │ └── chimeraos │ │ │ │ ├── index.theme │ │ │ │ └── scalable │ │ │ │ └── actions │ │ │ │ └── return-to-game-mode.svg │ │ ├── backgrounds │ │ │ └── chimeraos │ │ │ │ └── chimeraos_background.png │ │ ├── applications │ │ │ └── org.chimeraos.session-return.desktop │ │ ├── boxtron │ │ │ └── run-dosbox-wrapper │ │ ├── gnome-background-properties │ │ │ └── chimeraos-background.xml │ │ ├── polkit-1 │ │ │ └── actions │ │ │ │ ├── org.chimeraos.session.select.policy │ │ │ │ ├── org.chimeraos.priv.write.policy │ │ │ │ ├── org.chimeraos.steamvr.policy │ │ │ │ └── org.chimeraos.host.policy │ │ └── wireplumber │ │ │ └── main.lua.d │ │ │ └── 50-alsa-config.lua │ └── bin │ │ ├── chimera-session-use-lightdm │ │ ├── steamos-polkit-helpers │ │ ├── steamos-set-hostname │ │ ├── steamos-set-timezone │ │ └── steamos-priv-write │ │ ├── wpctl-wrapper │ │ ├── mkswapfile │ │ ├── gnome-session-oneshot │ │ └── chimera-session └── extra_certs │ └── codemasters.crt ├── .gitignore ├── aur-pkgs ├── build-aur-packages.sh ├── build-package.sh └── build-aur-package.sh ├── pkgs ├── build-package.sh ├── xonedo-firmware │ └── PKGBUILD ├── rtl88x2bu-dkms │ └── PKGBUILD └── xonedo-dkms │ └── PKGBUILD ├── .github ├── dependabot.yml └── workflows │ ├── build-builder.yml │ ├── release-branch.yml │ ├── build-system-image.yml │ ├── main.yml │ └── stable.yml ├── LICENSE ├── README.md ├── LICENSE.spdx ├── Dockerfile ├── manifest └── assets └── logo.svg /output/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /rootfs/etc/locale.conf: -------------------------------------------------------------------------------- 1 | LANG=en_US.UTF-8 -------------------------------------------------------------------------------- /rootfs/etc/skel/Templates/Empty file: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /rootfs/etc/skel/Templates/Text file.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /rootfs/etc/skel/Templates/Configuration file.conf: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /rootfs/etc/dconf/profile/user: -------------------------------------------------------------------------------- 1 | user-db:user 2 | system-db:local 3 | -------------------------------------------------------------------------------- /rootfs/etc/resolv.conf: -------------------------------------------------------------------------------- 1 | nameserver 8.8.8.8 2 | nameserver 8.8.4.4 3 | -------------------------------------------------------------------------------- /rootfs/usr/lib/firmware/aw87xxx_acf_air1s.bin: -------------------------------------------------------------------------------- 1 | awinic_smartk_acf.bin -------------------------------------------------------------------------------- /rootfs/usr/lib/firmware/aw87xxx_acf_airplus.bin: -------------------------------------------------------------------------------- 1 | awinic_smartk_acf.bin -------------------------------------------------------------------------------- /rootfs/usr/share/wayland-sessions/steamos.desktop: -------------------------------------------------------------------------------- 1 | gamescope-session.desktop -------------------------------------------------------------------------------- /rootfs/usr/share/icons/chimeraos/index.theme: -------------------------------------------------------------------------------- 1 | [Icon Theme] 2 | Inherits=Adwaita 3 | -------------------------------------------------------------------------------- /rootfs/etc/systemd/logind.conf.d/power_off.conf: -------------------------------------------------------------------------------- 1 | [Login] 2 | HandlePowerKey=suspend 3 | -------------------------------------------------------------------------------- /rootfs/etc/systemd/journald.conf.d/00-journal-size.conf: -------------------------------------------------------------------------------- 1 | [Journal] 2 | SystemMaxUse=50M 3 | -------------------------------------------------------------------------------- /rootfs/etc/xdg/gtk-3.0/settings.ini: -------------------------------------------------------------------------------- 1 | [Settings] 2 | gtk-application-prefer-dark-theme=1 3 | -------------------------------------------------------------------------------- /rootfs/etc/systemd/journald.conf.d/00-journal-persistent.conf: -------------------------------------------------------------------------------- 1 | [Journal] 2 | Storage=persistent 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.SRCINFO 2 | *.img.tar.xz 3 | *.img 4 | .cache/* 5 | output/* 6 | rootfs/etc/makepkg.conf 7 | -------------------------------------------------------------------------------- /rootfs/etc/NetworkManager/conf.d/00-disable-rand-mac.conf: -------------------------------------------------------------------------------- 1 | [device] 2 | wifi.scan-rand-mac-address=no 3 | -------------------------------------------------------------------------------- /rootfs/etc/dconf/db/local.d/01-dark-theme: -------------------------------------------------------------------------------- 1 | [org/gnome/desktop/interface] 2 | 3 | color-scheme='prefer-dark' 4 | -------------------------------------------------------------------------------- /rootfs/usr/lib/libFLAC.so.12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChimeraOS/chimeraos/HEAD/rootfs/usr/lib/libFLAC.so.12 -------------------------------------------------------------------------------- /rootfs/etc/lightdm/lightdm.conf.d/10-chimeraos-session.conf: -------------------------------------------------------------------------------- 1 | [Seat:*] 2 | autologin-session=gamescope-session-steam 3 | -------------------------------------------------------------------------------- /rootfs/etc/udev/rules.d/00-ntfs3-default-mount.rules: -------------------------------------------------------------------------------- 1 | SUBSYSTEM=="block", ENV{ID_FS_TYPE}=="ntfs", ENV{ID_FS_TYPE}="ntfs3" 2 | -------------------------------------------------------------------------------- /rootfs/etc/udev/rules.d/81-wol.rules: -------------------------------------------------------------------------------- 1 | ACTION=="add", SUBSYSTEM=="net", NAME=="enp*", RUN+="/usr/bin/ethtool -s $name wol g" 2 | -------------------------------------------------------------------------------- /rootfs/usr/lib/frzr.d/bootconfig.conf: -------------------------------------------------------------------------------- 1 | nvidia-drm.modeset=1 ibt=off split_lock_detect=off iomem=relaxed preempt=full nowatchdog 2 | -------------------------------------------------------------------------------- /rootfs/usr/lib/firmware/awinic_smartk_acf.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChimeraOS/chimeraos/HEAD/rootfs/usr/lib/firmware/awinic_smartk_acf.bin -------------------------------------------------------------------------------- /rootfs/usr/share/backgrounds/chimeraos/chimeraos_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ChimeraOS/chimeraos/HEAD/rootfs/usr/share/backgrounds/chimeraos/chimeraos_background.png -------------------------------------------------------------------------------- /rootfs/etc/sudoers.d/systemctl_needed: -------------------------------------------------------------------------------- 1 | # Provide nopasswd access for the session script to modify these specific systemd units 2 | ALL ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart inputplumber 3 | -------------------------------------------------------------------------------- /rootfs/usr/bin/chimera-session-use-lightdm: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | sed -i "/autologin-session/c\autologin-session=$1" /etc/lightdm/lightdm.conf.d/10-chimeraos-session.conf 4 | systemctl enable lightdm 5 | systemctl restart lightdm 6 | -------------------------------------------------------------------------------- /rootfs/usr/bin/steamos-polkit-helpers/steamos-set-hostname: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -eu 4 | 5 | if [[ $EUID -ne 0 ]]; 6 | then 7 | exec pkexec --disable-internal-agent "$0" "$@" 8 | fi 9 | 10 | hostnamectl set-hostname "$1" 11 | -------------------------------------------------------------------------------- /rootfs/usr/bin/steamos-polkit-helpers/steamos-set-timezone: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -eu 4 | 5 | if [[ $EUID -ne 0 ]]; 6 | then 7 | exec pkexec --disable-internal-agent "$0" "$@" 8 | fi 9 | 10 | timedatectl set-timezone "$1" 11 | 12 | -------------------------------------------------------------------------------- /rootfs/etc/mkinitcpio.conf: -------------------------------------------------------------------------------- 1 | # vim:set ft=sh 2 | 3 | MODULES=(dm_mod ext4 sha256 sha512 overlay) 4 | BINARIES=() 5 | FILES=() 6 | HOOKS=(microcode systemd modconf kms keyboard sd-vconsole block filesystems) 7 | COMPRESSION="xz" 8 | COMPRESSION_OPTIONS=(-v -9e) 9 | -------------------------------------------------------------------------------- /rootfs/etc/initcpio/install/frzr-etc: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | build() { 3 | add_binary findmnt 4 | add_runscript 5 | } 6 | help() { 7 | cat < /dev/null; then 5 | echo "boxtron: skip d3ddriverquery64.exe" 6 | exit 7 | fi 8 | 9 | /usr/share/boxtron/run-dosbox "$@" 10 | -------------------------------------------------------------------------------- /rootfs/etc/locale.gen: -------------------------------------------------------------------------------- 1 | de_DE.UTF-8 UTF-8 2 | en_GB.UTF-8 UTF-8 3 | en_US.UTF-8 UTF-8 4 | es_AR.UTF-8 UTF-8 5 | es_ES.UTF-8 UTF-8 6 | fr_CA.UTF-8 UTF-8 7 | fr_FR.UTF-8 UTF-8 8 | it_IT.UTF-8 UTF-8 9 | ja_JP.UTF-8 UTF-8 10 | pt_BR.UTF-8 UTF-8 11 | pt_PT.UTF-8 UTF-8 12 | th_TH.UTF-8 UTF-8 13 | zh_CN.UTF-8 UTF-8 14 | -------------------------------------------------------------------------------- /aur-pkgs/build-aur-packages.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | set -x 5 | 6 | source manifest; 7 | 8 | sudo mkdir -p /workdir/aur-pkgs 9 | sudo chown build:build /workdir/aur-pkgs 10 | 11 | PIKAUR_CMD="PKGDEST=/workdir/aur-pkgs pikaur --noconfirm -Sw ${AUR_PACKAGES}" 12 | PIKAUR_RUN=(bash -c "${PIKAUR_CMD}") 13 | "${PIKAUR_RUN[@]}" -------------------------------------------------------------------------------- /rootfs/usr/bin/wpctl-wrapper: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | parents=$(pstree --show-parents $$) 4 | 5 | steam_parent=0 6 | if echo "$parents" | grep "\-steam\-" &> /dev/null; then 7 | steam_parent=1 8 | fi 9 | 10 | if [[ "$steam_parent" == "1" ]] && [[ "$1" == "clear-default" ]]; then 11 | exit 0 12 | fi 13 | 14 | /usr/libexec/wpctl $@ 15 | -------------------------------------------------------------------------------- /rootfs/usr/share/wayland-sessions/gnome-session-oneshot.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=GNOME on Wayland (single time session) 3 | Comment=This session logs you into GNOME one time 4 | Exec=/usr/bin/gnome-session-oneshot 5 | TryExec=/usr/bin/gnome-session-oneshot 6 | Type=Application 7 | DesktopNames=GNOME 8 | X-GDM-SessionRegisters=true 9 | -------------------------------------------------------------------------------- /rootfs/usr/lib/frzr.d/swap-fix.migration: -------------------------------------------------------------------------------- 1 | # Delete broken swapfile 2 | post_install() { 3 | SWAPFILE="/home/swapfile" 4 | if [ -e "$SWAPFILE" ] && [ $(stat -c%s "$SWAPFILE") -gt 0 ]; then 5 | # swapfile is not broken, exit silently 6 | return 0 7 | fi 8 | 9 | echo "Removing broken swapfile..." 10 | rm -f "$SWAPFILE" 11 | echo "Broken swapfile removed" 12 | } 13 | -------------------------------------------------------------------------------- /rootfs/etc/dconf/db/local.d/01-background: -------------------------------------------------------------------------------- 1 | # dconf path 2 | [org/gnome/desktop/background] 3 | 4 | # dconf key names and their corresponding values 5 | picture-uri='file:///usr/share/backgrounds/chimeraos/chimeraos_background.png' 6 | picture-uri-dark='file:///usr/share/backgrounds/chimeraos/chimeraos_background.png' 7 | picture-options='scaled' 8 | primary-color='000000' 9 | secondary-color='000000' 10 | -------------------------------------------------------------------------------- /rootfs/etc/polkit-1/rules.d/41-steamvr.rules: -------------------------------------------------------------------------------- 1 | /* Allow members of the wheel group to execute the defined actions 2 | * without password authentication, similar to "sudo NOPASSWD:" 3 | */ 4 | polkit.addRule(function(action, subject) { 5 | if ((action.id == "org.chimeraos.steamvr.pkexec") && 6 | subject.isInGroup("wheel")) 7 | { 8 | return polkit.Result.YES; 9 | } 10 | }); 11 | -------------------------------------------------------------------------------- /rootfs/etc/polkit-1/rules.d/40-system-tweaks.rules: -------------------------------------------------------------------------------- 1 | polkit.addRule(function(action, subject) { 2 | if ((action.id == "org.freedesktop.timedate1.set-time" || 3 | action.id == "org.freedesktop.timedate1.set-timezone" || 4 | action.id == "org.freedesktop.login1.power-off" || 5 | action.id == "org.freedesktop.login1.reboot") && 6 | subject.isInGroup("wheel")) { 7 | return polkit.Result.YES; 8 | } 9 | }); -------------------------------------------------------------------------------- /pkgs/build-package.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -x 4 | 5 | sudo chown -R build:build /workdir/pkgs 6 | 7 | PIKAUR_CMD="PKGDEST=/workdir/pkgs pikaur --noconfirm --build-gpgdir /etc/pacman.d/gnupg -S -P /workdir/${1}/PKGBUILD" 8 | PIKAUR_RUN=(bash -c "${PIKAUR_CMD}") 9 | "${PIKAUR_RUN[@]}" 10 | # remove any epoch (:) in name, replace with -- since not allowed in artifacts 11 | find /workdir/pkgs/*.pkg.tar* -type f -name '*:*' -execdir bash -c 'mv "$1" "${1//:/--}"' bash {} \; -------------------------------------------------------------------------------- /aur-pkgs/build-package.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -x 4 | 5 | sudo chown -R build:build /workdir/aur-pkgs 6 | 7 | PIKAUR_CMD="PKGDEST=/workdir/aur-pkgs pikaur --noconfirm --build-gpgdir /etc/pacman.d/gnupg -S -P /workdir/${1}/PKGBUILD" 8 | PIKAUR_RUN=(bash -c "${PIKAUR_CMD}") 9 | "${PIKAUR_RUN[@]}" 10 | # remove any epoch (:) in name, replace with -- since not allowed in artifacts 11 | find /workdir/aur-pkgs/*.pkg.tar* -type f -name '*:*' -execdir bash -c 'mv "$1" "${1//:/--}"' bash {} \; -------------------------------------------------------------------------------- /rootfs/usr/share/gnome-background-properties/chimeraos-background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ChimeraOS Background 6 | /usr/share/backgrounds/chimeraos/chimeraos_background.png 7 | scaled 8 | solid 9 | #000000 10 | #000000 11 | 12 | 13 | -------------------------------------------------------------------------------- /rootfs/usr/lib/frzr.d/remove-extraneous-wireplumber-config.migration: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | # Remove extraneous wireplumber configuration made by quirks that 4 | # interferes with first boot 5 | post_install() { 6 | local MOUNT_PATH=$1 7 | 8 | if [ -d "${MOUNT_PATH}/etc/wireplumber" ]; then 9 | # We have a wireplumber setup should delete it, 10 | # device quirks would recreate it anyways 11 | 12 | mv -f -b "${MOUNT_PATH}/etc/wireplumber" "${MOUNT_PATH}/etc/wireplumber.bak" 13 | echo "Wireplumber setup is reset and backed up as /etc/wireplumber.old" 14 | fi 15 | } 16 | -------------------------------------------------------------------------------- /rootfs/etc/systemd/system/home-swapfile.swap: -------------------------------------------------------------------------------- 1 | # SPDX-License-Identifier: LGPL-2.1+ 2 | # 3 | # This file is part of steamos-customizations. 4 | # 5 | # steamos-customizations is free software; you can redistribute it and/or 6 | # modify it under the terms of the GNU Lesser General Public License as 7 | # published by the Free Software Foundation; either version 2.1 of the License, 8 | # or (at your option) any later version. 9 | 10 | [Unit] 11 | Description=Swap 12 | Requires=swapfile.service 13 | After=swapfile.service 14 | 15 | [Swap] 16 | What=/home/swapfile 17 | 18 | [Install] 19 | WantedBy=swap.target -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # dependabot.yml 2 | # Author: D.A.Pelasgus 3 | 4 | version: 2 5 | updates: 6 | - package-ecosystem: "docker" 7 | directory: "/" 8 | schedule: 9 | interval: "daily" 10 | commit-message: 11 | prefix: "chore" 12 | reviewers: 13 | - "alkazar" 14 | - "samsagax" 15 | - "pastaq" 16 | - "neroreflex" 17 | 18 | - package-ecosystem: "github-actions" 19 | directory: "/" 20 | schedule: 21 | interval: "daily" 22 | commit-message: 23 | prefix: "chore" 24 | reviewers: 25 | - "alkazar" 26 | - "samsagax" 27 | - "pastaq" 28 | - "neroreflex" 29 | -------------------------------------------------------------------------------- /rootfs/usr/lib/frzr.d/systemd-boot.migration: -------------------------------------------------------------------------------- 1 | # Migrate to systemd-boot 2 | post_install() { 3 | local MOUNT_PATH=$1 4 | 5 | if [ -e ${MOUNT_PATH}/boot/loader/random-seed ]; then 6 | # migration has already completed, exit silently 7 | return 0 8 | fi 9 | 10 | echo "Migrating to systemd-boot..." 11 | 12 | if [ "$#" -lt 1 ]; then 13 | echo "Migration aborted: not enough arguments" 14 | return 1 15 | fi 16 | 17 | if [ ! -d /sys/firmware/efi/efivars ]; then 18 | echo "Aborting: cannot migrate legacy BIOS install to systemd-boot" 19 | return 0 20 | fi 21 | 22 | rm -rf ${MOUNT_PATH}/boot/EFI 23 | bootctl --esp-path=${MOUNT_PATH}/boot/ install 24 | 25 | echo "Migration to systemd-boot complete" 26 | } 27 | -------------------------------------------------------------------------------- /aur-pkgs/build-aur-package.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | set -x 5 | 6 | source manifest; 7 | 8 | sudo mkdir -p /temp/package 9 | sudo chown build:build /temp/package 10 | sudo chown build:build /workdir/aur-pkgs 11 | 12 | git clone --depth=1 https://aur.archlinux.org/${1}.git /temp/package 13 | 14 | PIKAUR_CMD="PKGDEST=/workdir/aur-pkgs pikaur --noconfirm --build-gpgdir /etc/pacman.d/gnupg -S -P /temp/package/PKGBUILD" 15 | PIKAUR_RUN=(bash -c "${PIKAUR_CMD}") 16 | "${PIKAUR_RUN[@]}" 17 | # if aur package is not successfully built, exit 18 | if [ $? -ne 0 ]; then 19 | echo "Build failed. Stopping..." 20 | exit -1 21 | fi 22 | # remove any epoch (:) in name, replace with -- since not allowed in artifacts 23 | find /workdir/aur-pkgs/*.pkg.tar* -type f -name '*:*' -execdir bash -c 'mv "$1" "${1//:/--}"' bash {} \; -------------------------------------------------------------------------------- /rootfs/etc/systemd/system/swapfile.service: -------------------------------------------------------------------------------- 1 | # SPDX-License-Identifier: LGPL-2.1+ 2 | # 3 | # This file is part of steamos-customizations. 4 | # 5 | # steamos-customizations is free software; you can redistribute it and/or 6 | # modify it under the terms of the GNU Lesser General Public License as 7 | # published by the Free Software Foundation; either version 2.1 of the License, 8 | # or (at your option) any later version. 9 | 10 | [Unit] 11 | Description=Create Swap File 12 | DefaultDependencies=no 13 | Before=shutdown.target home-swapfile.swap 14 | Conflicts=shutdown.target 15 | ConditionFileIsExecutable=/usr/bin/mkswapfile 16 | ConditionPathExists=!/home/swapfile 17 | RequiresMountsFor=/home/swapfile 18 | 19 | [Service] 20 | Type=oneshot 21 | RemainAfterExit=yes 22 | ExecStart=/usr/bin/mkswapfile /home/swapfile 4096 23 | 24 | [Install] 25 | WantedBy=swap.target 26 | 27 | -------------------------------------------------------------------------------- /rootfs/usr/share/polkit-1/actions/org.chimeraos.session.select.policy: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | ChimeraOS Chimera 8 | http://chimeraos.org 9 | 10 | 11 | Helper to switch sessions 12 | package-x-generic 13 | 14 | yes 15 | yes 16 | yes 17 | 18 | /usr/lib/os-session-select 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /rootfs/etc/initcpio/hooks/frzr-etc: -------------------------------------------------------------------------------- 1 | #!/usr/bin/ash 2 | run_latehook() { 3 | local rootfs realtab frzropts frzrsrc 4 | rootfs="/new_root" 5 | realtab="${rootfs}/etc/fstab" 6 | 7 | if [ -f "${realtab}" ]; then 8 | # read values from fstab 9 | frzrsrc=$(findmnt -snero source --tab-file="$realtab" -T /frzr_root) 10 | frzropts=$(findmnt -snero options --tab-file="$realtab" -T /frzr_root) 11 | 12 | if [ -z "${frzropts}" ]; then 13 | mount "${frzrsrc}" ${rootfs}/frzr_root 14 | else 15 | mount -o "${frzropts}" "${frzrsrc}" ${rootfs}/frzr_root 16 | fi 17 | else 18 | # fallback, when not found in fstab 19 | mount /dev/disk/by-label/frzr_root \${rootfs}/frzr_root 20 | fi 21 | 22 | # mount etc from frzr_root as overlay 23 | mount -t overlay overlay -o lowerdir=${rootfs}/etc,upperdir=${rootfs}/frzr_root/etc,workdir=${rootfs}/frzr_root/.etc,index=off ${rootfs}/etc 24 | } -------------------------------------------------------------------------------- /pkgs/xonedo-firmware/PKGBUILD: -------------------------------------------------------------------------------- 1 | # Maintainer: Michał Kopeć 2 | # Contributor: Michał Kopeć 3 | 4 | pkgname=xonedo-firmware 5 | pkgver=0.1 6 | pkgrel=8 7 | pkgdesc='Xbox Wireless Controller Adapter firmware' 8 | arch=('x86_64') 9 | url='https://github.com/boukehaarsma23/xone' 10 | license=('custom') 11 | source=("http://download.windowsupdate.com/c/msdownload/update/driver/drvs/2017/07/1cd6a87c-623f-4407-a52d-c31be49e925c_e19f60808bdcbfbd3c3df6be3e71ffc52e43261e.cab") 12 | sha256sums=('65736a84ff4036645b8f8ec602bed91ab6353019c9cb3233decab9feec0f6f04') 13 | 14 | package() { 15 | echo "* Extracting dongle firmware..." 16 | echo "* The firmware for the wireless dongle is subject to Microsoft's Terms of Use:" 17 | echo "* https://www.microsoft.com/en-us/legal/terms-of-use" 18 | install -D -m 644 "${srcdir}/FW_ACC_00U.bin" "${pkgdir}/usr/lib/firmware/xow_dongle.bin" 19 | } 20 | 21 | -------------------------------------------------------------------------------- /rootfs/usr/share/polkit-1/actions/org.chimeraos.priv.write.policy: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | ChimeraOS 8 | http://chimeraos.org 9 | 10 | 11 | Helper to write to a set of device nodes 12 | package-x-generic 13 | 14 | yes 15 | yes 16 | yes 17 | 18 | /usr/bin/steamos-polkit-helpers/steamos-priv-write 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /rootfs/usr/share/polkit-1/actions/org.chimeraos.steamvr.policy: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | Authentication is required to change steamvr compositor capabilities 7 | 8 | no 9 | no 10 | yes 11 | 12 | /usr/bin/setcap 13 | CAP_SYS_NICE=eip 14 | /home/gamer/.local/share/Steam/steamapps/common/SteamVR/bin/linux64/vrcompositor-launcher 15 | 16 | 17 | -------------------------------------------------------------------------------- /.github/workflows/build-builder.yml: -------------------------------------------------------------------------------- 1 | name: Build docker container 2 | 3 | env: 4 | REGISTRY: ghcr.io 5 | IMAGE_NAME: ${{ github.repository }} 6 | 7 | on: 8 | workflow_dispatch: 9 | workflow_call: 10 | 11 | jobs: 12 | build: 13 | name: Build base docker image 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v4 17 | - name: Login to GitHub Container Registry 18 | uses: docker/login-action@v3 19 | with: 20 | registry: ${{ env.REGISTRY }} 21 | username: ${{ github.actor }} 22 | password: ${{ secrets.GITHUB_TOKEN }} 23 | - name: Extract metadata (tags, labels) for Docker 24 | id: meta 25 | uses: docker/metadata-action@v5 26 | with: 27 | images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} 28 | - name: Build and push Docker image 29 | uses: docker/build-push-action@v6 30 | with: 31 | context: . 32 | push: true 33 | tags: ${{ steps.meta.outputs.tags }} 34 | labels: ${{ steps.meta.outputs.labels }} 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Alesh Slovak, Wouter Wijsman, Thomas Wilhelm-Stein 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /pkgs/rtl88x2bu-dkms/PKGBUILD: -------------------------------------------------------------------------------- 1 | # Maintainer: Rin Cat 2 | 3 | pkgname=rtl88x2bu-dkms-git 4 | _pkgbase=rtl88x2bu 5 | pkgver=5.13.1.r199.bf52727 6 | _pkgver=5.13.1 7 | pkgrel=1 8 | pkgdesc="Kernel module for Realtek rtl88x2bu WiFi chipset" 9 | arch=('i686' 'x86_64' 'arm' 'armv6h' 'armv7h' 'aarch64') 10 | url="https://github.com/RinCat/RTL88x2BU-Linux-Driver" 11 | license=('GPL2') 12 | depends=('dkms' 'bc') 13 | makedepends=('git') 14 | source=("git+https://github.com/RinCat/RTL88x2BU-Linux-Driver.git") 15 | sha256sums=('SKIP') 16 | 17 | pkgver() { 18 | cd "${srcdir}/RTL88x2BU-Linux-Driver" 19 | printf '%s.r%s.%s' "${_pkgver}" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)" 20 | } 21 | 22 | package() { 23 | cd "${srcdir}/RTL88x2BU-Linux-Driver" 24 | mkdir -p "${pkgdir}/usr/src/${_pkgbase}-${pkgver}" 25 | cp -pr * "${pkgdir}/usr/src/${_pkgbase}-${pkgver}" 26 | install -Dm644 dkms.conf "${pkgdir}/usr/src/${_pkgbase}-${pkgver}/dkms.conf" 27 | sed -e "s/@PKGVER@/${pkgver}/" -i "${pkgdir}/usr/src/${_pkgbase}-${pkgver}/dkms.conf" 28 | mkdir -p "${pkgdir}/usr/lib/modprobe.d/" 29 | echo "blacklist rtw88_8822bu" > "${pkgdir}/usr/lib/modprobe.d/rtw8822bu.conf" 30 | } 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |

ChimeraOS

3 | 4 | [![status](https://img.shields.io/badge/status-stable-%23961937.svg?style=for-the-badge)](https://github.com/chimeraos/install-media/releases/latest) 5 | [![License](https://img.shields.io/badge/License-MIT-%23961937.svg?style=for-the-badge)](https://github.com/ChimeraOS/chimeraos/blob/master/LICENSE) 6 | [![Chat Server](https://img.shields.io/badge/chat-discord-%23961937.svg?style=for-the-badge)](https://discord.gg/fKsUbrt) 7 | [![website](https://img.shields.io/badge/website-chimeraos.org-%23961937.svg?style=for-the-badge)](https://chimeraos.org) 8 | [![Made with Love](https://img.shields.io/badge/made_with-❤-%23961937.svg?style=for-the-badge)](https://chimeraos.org) 9 | 10 | Bringing the console experience to pc. 11 | 12 | > [!CAUTION] 13 | > DO NOT DOWNLOAD DIRECTLY FROM THE RELEASES PAGE. 14 | > THIS IS NOT INSTALLATION MEDIA. 15 | 16 | > [!IMPORTANT] 17 | > To download use the following link: 18 | > [ChimeraOS website](https://chimeraos.org) 19 | 20 | > [!NOTE] 21 | > Instantly turn any PC into a gaming console. 22 | > 23 | > Thousands of games, dozens of platforms. 24 | > 25 | > Fully controller compatible interface. 26 | > 27 | > Automatic updates that stay out of the way. 28 | -------------------------------------------------------------------------------- /pkgs/xonedo-dkms/PKGBUILD: -------------------------------------------------------------------------------- 1 | # Maintainer: Michał Kopeć 2 | # Contributor: Michał Kopeć 3 | 4 | _pkgname=xonedo 5 | pkgname=xonedo-dkms 6 | pkgver=0.5.r0.g0c1c508 7 | pkgrel=1 8 | pkgdesc='Modern Linux driver for Xbox One and Xbox Series X|S controllers via the official dongle only' 9 | arch=('x86_64') 10 | url='https://github.com/boukehaarsma23/xone.git' 11 | license=('GPL2') 12 | depends=('dkms') 13 | #optdepends=('xonedo-dongle-firmware') 14 | makedepends=('git') 15 | conflicts=('xone-dkms' 16 | 'xow') 17 | provides=('xone-dkms') 18 | source=("git+https://github.com/NeroReflex/xonedo.git") 19 | sha256sums=('SKIP') 20 | 21 | pkgver() { 22 | cd "$srcdir/$_pkgname" 23 | git describe --long --tags | sed 's/^v//;s/\([^-]*-g\)/r\1/;s/-/./g' 24 | } 25 | 26 | package() { 27 | cd "${srcdir}/${_pkgname}" 28 | 29 | find . -type f \( -name 'dkms.conf' -o -name '*.c' \) -exec sed -i "s/#VERSION#/$pkgver/" {} + 30 | echo 'ccflags-y += -DDEBUG' >> "Kbuild" 31 | 32 | echo "* Copying module into /usr/src..." 33 | install -dm755 "${pkgdir}/usr/src/${_pkgname}-${pkgver}" 34 | cp -r ${srcdir}/$_pkgname/* "${pkgdir}/usr/src/${_pkgname}-${pkgver}" 35 | 36 | echo "* Blacklisting required wireless module..." 37 | install -D -m 644 install/modprobe.conf "${pkgdir}/usr/lib/modprobe.d/xonedo-blacklist.conf" 38 | } 39 | 40 | -------------------------------------------------------------------------------- /rootfs/usr/share/polkit-1/actions/org.chimeraos.host.policy: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | ChimeraOS Chimera 8 | http://chimeraos.org 9 | 10 | 11 | Set the hostname 12 | package-x-generic 13 | 14 | yes 15 | yes 16 | yes 17 | 18 | /usr/bin/steamos-polkit-helpers/steamos-set-hostname 19 | 20 | 21 | 22 | Set the timezone 23 | package-x-generic 24 | 25 | yes 26 | yes 27 | yes 28 | 29 | /usr/bin/steamos-polkit-helpers/steamos-set-timezone 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /rootfs/usr/lib/os-branch-select: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | BRANCH_PATH="/frzr_root/source" 5 | REPO="chimeraos/chimeraos" 6 | 7 | if [[ $# -eq 1 ]]; then 8 | case "$1" in 9 | "-c") 10 | branch=$(cat "$BRANCH_PATH" 2> /dev/null | sed -n 's/^chimeraos\/chimeraos://; /^stable$\|^unstable$\|^testing$/{p;q};') 11 | case "$branch" in 12 | "stable" | "unstable" | "testing") 13 | echo "$branch" 14 | exit 0 15 | ;; 16 | *) 17 | # This can happen on CI builds or when downgrading from a newer build that knows of more branches. The update 18 | # path should decide how to handle it. 19 | echo >&2 "Warning: Unrecognized currently selected branch name '$branch', updates may not succeed." 20 | echo "$branch" 21 | exit 0 22 | ;; 23 | esac 24 | ;; 25 | "-l") 26 | echo stable 27 | echo unstable 28 | echo testing 29 | # echo USB 30 | # echo Network 31 | exit 0 32 | ;; 33 | "stable" | "unstable" | "testing") 34 | echo "$REPO:$1" > "$BRANCH_PATH" 35 | exit 0 36 | ;; 37 | "unstable") 38 | echo "The unstable branch has a high risk of breaking." 39 | echo "Do NOT use it unless you know what you are doing." 40 | echo "$REPO:$1" > "$BRANCH_PATH" 41 | exit 0 42 | ;; 43 | esac 44 | fi 45 | 46 | echo "Usage: steamos-select-branch <-stable|unstable|testing>" 1>&2 47 | -------------------------------------------------------------------------------- /rootfs/usr/bin/mkswapfile: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # -*- mode: sh; indent-tabs-mode: nil; sh-basic-offset: 4; -*- 3 | # vim: et sts=4 sw=4 4 | 5 | # SPDX-License-Identifier: LGPL-2.1+ 6 | # 7 | # Copyright © 2019-2021 Collabora Ltd. 8 | # Copyright © 2019-2021 Valve Corporation. 9 | # 10 | # This file is part of steamos-customizations. 11 | # 12 | # steamos-customizations is free software; you can redistribute it and/or 13 | # modify it under the terms of the GNU Lesser General Public License as 14 | # published by the Free Software Foundation; either version 2.1 of the License, 15 | # or (at your option) any later version. 16 | 17 | set -euo pipefail 18 | 19 | SWAPFILE=${1:-} 20 | SWAPSIZE=${2:-} 21 | 22 | fail() { echo >&2 "$@"; exit 1; } 23 | usage() { echo >&2 "Usage: $(basename $0) FILE SIZE"; exit 1; } 24 | 25 | [ "$SWAPFILE" ] || usage 26 | [ "$SWAPSIZE" ] || usage 27 | 28 | [ -e "$SWAPFILE" ] && fail "File '$SWAPFILE' already exists" 29 | 30 | BASE_DIR=$(dirname "$SWAPFILE") 31 | BUFFER_MB=10000 32 | AVAIL_DISK_MB=$(df -BM "$BASE_DIR" | tail -1 | tr -s ' ' | cut -d' ' -f4 | sed 's/M//') 33 | REQUIRED_BUFFER_MB=$(($BUFFER_MB + $SWAPSIZE)) 34 | [ "$AVAIL_DISK_MB" -lt "$REQUIRED_BUFFER_MB" ] && fail "Not enough free disk space" 35 | 36 | touch "$SWAPFILE" 37 | chattr +C "$SWAPFILE" 38 | btrfs property set "$SWAPFILE" compression none && true # prevent script failure when using nodatacow 39 | dd if=/dev/zero of="$SWAPFILE" bs=1M count="$SWAPSIZE" 40 | chmod 600 "$SWAPFILE" 41 | mkswap "$SWAPFILE" 42 | -------------------------------------------------------------------------------- /rootfs/extra_certs/codemasters.crt: -------------------------------------------------------------------------------- 1 | -----BEGIN CERTIFICATE----- 2 | MIID5zCCAs+gAwIBAgIJAIIfD20HgCPEMA0GCSqGSIb3DQEBBQUAMIGJMQswCQYD 3 | VQQGEwJVSzEVMBMGA1UECAwMV2Fyd2lja3NoaXJlMSEwHwYDVQQKDBhDb2RlbWFz 4 | dGVycyBTb2Z0d2FyZSBMdGQxGzAZBgNVBAsMEkNvZGVtYXN0ZXJzIE9ubGluZTEj 5 | MCEGA1UEAwwaQ29kZW1hc3RlcnMgT25saW5lIFJvb3QgQ0EwHhcNMTAwOTIyMDgx 6 | NjA4WhcNMzUwOTE2MDgxNjA4WjCBiTELMAkGA1UEBhMCVUsxFTATBgNVBAgMDFdh 7 | cndpY2tzaGlyZTEhMB8GA1UECgwYQ29kZW1hc3RlcnMgU29mdHdhcmUgTHRkMRsw 8 | GQYDVQQLDBJDb2RlbWFzdGVycyBPbmxpbmUxIzAhBgNVBAMMGkNvZGVtYXN0ZXJz 9 | IE9ubGluZSBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA 10 | ncw3VeQt3N8ZJmNGiCa8UJ61qtBWxat2yx9bWfyf2o4VqQtn7Cc79esHkf5Zbjpc 11 | zqMpxO/c0vZnHWgH1R0TWRDrSqKHuJxgbxT2JFoLAQQKm+uTUOclLvlC00IrINks 12 | Y6KPYaQDkaLDAQWX42YGqb7CaKna8DwX6Ms4RHLEm5+L0L5GgRk9RfPlphVYCA9r 13 | tjJIQluYMc0Ny4tzJ6IuCnDjgRfmehWSpBV+UAx8FHFxmOUgone6dhA0pTLtR/lu 14 | P/S2aISWgQZJ0GWWfQ/mjVpccnWKtZUK0TCVoKTPpGaV4kTDHYq9ylpuNItTww9E 15 | rXR0/9gWOZHQ49QXd2rnrQIDAQABo1AwTjAdBgNVHQ4EFgQU9vW1MrzNfAbZeTQJ 16 | gHCzyQQlAZgwHwYDVR0jBBgwFoAU9vW1MrzNfAbZeTQJgHCzyQQlAZgwDAYDVR0T 17 | BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAcOUnPyvrbAdzMSPN9PLnvh34I9jW 18 | EwU81ks67EBNHaMdghiUhOFZ65vzQLoUYoqQcgzu+i0rAkLZrfviC1TUlv+mdlgK 19 | ce6eD2VgpQOPrpOG6O/TfmyAhS5mOlA35NMsZqZTpIiTZnZLGHSSu/Shvnk7UDTs 20 | lTp1yNj6etlY03ABieBsSIDu0UmhNfEY2HgjPaGGiAmcenw2d4U5Z2oCiJVDseeq 21 | RdlVx/sg4UM8L24/ccqn5uV05cg5aUF5dAlAYLq2wXNgbkpePtmo+/tqdiE3pL+q 22 | TRW14lealjJNmjUUTO/KHjKOpfPJNCHSGLk/h/UskEvcTUTqwDZATCl4jw== 23 | -----END CERTIFICATE----- 24 | -------------------------------------------------------------------------------- /.github/workflows/release-branch.yml: -------------------------------------------------------------------------------- 1 | name: Create Stable Branch 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | jobs: 7 | createstable: 8 | name: Create stable branch 9 | runs-on: ubuntu-latest 10 | 11 | steps: 12 | - uses: actions/checkout@v4 13 | - name: Read version 14 | id: set-version 15 | run: | 16 | source ./manifest ; echo "version=$(echo ${VERSION})" >> $GITHUB_OUTPUT 17 | - name: Create stable branch 18 | run: git checkout -b stable-${{ steps.set-version.outputs.version }} 19 | - name: Initialize mandatory git config 20 | run: | 21 | git config user.name "GitHub Actions" 22 | git config user.email noreply@github.com 23 | - name: Fix ARCHIVE_DATE 24 | run: | 25 | DATE=$(date -d 'yesterday' +%Y/%m/%d) 26 | sed -i 's@ARCHIVE_DATE.*@ARCHIVE_DATE=\"'"$DATE"'\"@g' manifest 27 | git add manifest 28 | git commit --message "Fixate ARCHIVE_DATE" 29 | - name: Set AUR-submodules 30 | run: | 31 | source ./manifest 32 | pushd aur-pkgs 33 | for package in ${AUR_PACKAGES}; do 34 | git submodule add https://aur.archlinux.org/${package}.git 35 | done 36 | popd 37 | git add . 38 | git commit --message "Pin AUR-packages for ${{ steps.set-version.outputs.version }}" 39 | - name: Push new branch 40 | run: git push origin stable-${{ steps.set-version.outputs.version }} 41 | - name: Increment version on master 42 | run: | 43 | source ./manifest 44 | NEXT=$((VERSION + 1)) 45 | git checkout master 46 | sed -i 's@VERSION.*@VERSION=\"'"$NEXT"'\"@g' manifest 47 | git add manifest 48 | git commit --message "Bump version" --message "[skip ci]" 49 | git push 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /rootfs/usr/bin/steamos-polkit-helpers/steamos-priv-write: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -eu 4 | 5 | if [[ $EUID -ne 0 ]]; then 6 | exec pkexec --disable-internal-agent "$0" "$@" 7 | fi 8 | 9 | WRITE_PATH="$1" 10 | WRITE_VALUE="$2" 11 | 12 | function CommitWrite() { 13 | if [ ! -z "$WRITE_VALUE" ]; then 14 | echo "chmod a+w: $WRITE_PATH" | systemd-cat -t p-steamos-priv-write -p warning 15 | chmod a+w "$WRITE_PATH" 16 | echo "commit: $WRITE_VALUE -> $WRITE_PATH" | systemd-cat -t p-steamos-priv-write -p warning 17 | echo "$WRITE_VALUE" >"$WRITE_PATH" 18 | fi 19 | exit 0 20 | } 21 | 22 | function DeclineWrite() { 23 | echo "decline: $WRITE_VALUE -> $WRITE_PATH" | systemd-cat -t p-steamos-priv-write -p err 24 | exit 1 25 | } 26 | 27 | echo "checking: $WRITE_PATH" | systemd-cat -t p-steamos-priv-write -p warning 28 | if [[ "$WRITE_PATH" == /sys/class/backlight/*/brightness ]]; then 29 | CommitWrite 30 | fi 31 | 32 | ## TODO: Don't know what this does yet. Keep it here for refrence until we can figure it out. 33 | #if [[ "$WRITE_PATH" == /dev/drm_dp_aux0 ]]; then 34 | # CommitWrite 35 | #fi 36 | 37 | if [[ "$WRITE_PATH" == /sys/class/drm/card*/device/power_dpm_force_performance_level ]]; then 38 | CommitWrite 39 | fi 40 | 41 | if [[ "$WRITE_PATH" == /sys/class/hwmon/hwmon*/power*_cap ]]; then 42 | CommitWrite 43 | fi 44 | 45 | if [[ "$WRITE_PATH" == /sys/devices/platform/*/*/*/iio:device*/in_illuminance_integration_time ]]; then 46 | CommitWrite 47 | fi 48 | 49 | if [[ "$WRITE_PATH" == /sys/devices/*/*/*/*/hwmon/hwmon*/led_brightness ]]; then 50 | CommitWrite 51 | fi 52 | 53 | if [[ "$WRITE_PATH" == /sys/devices/*/*/*/*/hwmon/hwmon*/content_adaptive_brightness ]]; then 54 | CommitWrite 55 | fi 56 | 57 | if [[ "$WRITE_PATH" == /sys/devices/platform/*/i2c-2/i2c-*/brightness ]]; then 58 | CommitWrite 59 | fi 60 | 61 | if [[ "$WRITE_PATH" == /sys/devices/platform/*/i2c-2/i2c-*/bmode ]]; then 62 | CommitWrite 63 | fi 64 | 65 | if [[ "$WRITE_PATH" == /sys/class/leds/status\:white/led_brightness_multiplier ]]; then 66 | CommitWrite 67 | fi 68 | 69 | DeclineWrite 70 | -------------------------------------------------------------------------------- /LICENSE.spdx: -------------------------------------------------------------------------------- 1 | SPDXVersion: SPDX-2.1 2 | DataLicense: CC0-1.0 3 | DataFormat: SPDXRef-1 4 | SPDXID: SPDXRef-DOCUMENT 5 | DocumentName: ChimeraOS 6 | DocumentNamespace: http://spdx.org/spdxdocs/chimeraos-2024 7 | Creator: Person: D.A.Pelasgus 8 | Created: 2024-10-02T12:00:00Z 9 | LicenseListVersion: 3.9 10 | 11 | ##### Package Information ##### 12 | PackageName: ChimeraOS 13 | SPDXID: SPDXRef-Package 14 | PackageVersion: 1.0.0 15 | PackageFileName: ChimeraOS 16 | PackageSupplier: Organization: ChimeraOS 17 | PackageOriginator: Organization: ChimeraOS 18 | PackageDownloadLocation: https://chimeraos.org/download 19 | PackageLicenseConcluded: MIT 20 | PackageLicenseDeclared: MIT 21 | PackageCopyrightText: Copyright (c) 2024 ChimeraOS 22 | 23 | ##### License Information ##### 24 | LicenseID: MIT 25 | LicenseName: MIT License 26 | ExtractedText: | 27 | MIT License 28 | 29 | Copyright (c) 2019 Alesh Slovak, Wouter Wijsman, Thomas Wilhelm-Stein 30 | 31 | Permission is hereby granted, free of charge, to any person obtaining a copy 32 | of this software and associated documentation files (the "Software"), to deal 33 | in the Software without restriction, including without limitation the rights 34 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 35 | copies of the Software, and to permit persons to whom the Software is 36 | furnished to do so, subject to the following conditions: 37 | 38 | The above copyright notice and this permission notice shall be included in all 39 | copies or substantial portions of the Software. 40 | 41 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 42 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 43 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 44 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 45 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 46 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 47 | SOFTWARE. 48 | 49 | LicenseCrossReference: https://opensource.org/licenses/MIT 50 | LicenseComment: This is the standard MIT License used by ChimeraOS. 51 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM greyltc/archlinux-aur:latest 2 | LABEL contributor="shadowapex@gmail.com" 3 | COPY rootfs/etc/pacman.conf /etc/pacman.conf 4 | RUN echo -e "keyserver-options auto-key-retrieve" >> /etc/pacman.d/gnupg/gpg.conf && \ 5 | # Cannot check space in chroot 6 | sed -i '/CheckSpace/s/^/#/g' /etc/pacman.conf && \ 7 | pacman-key --init && \ 8 | pacman --noconfirm -Syyuu && \ 9 | pacman --noconfirm -S \ 10 | arch-install-scripts \ 11 | btrfs-progs \ 12 | fmt \ 13 | xcb-util-wm \ 14 | wget \ 15 | pyalpm \ 16 | python \ 17 | python-build \ 18 | python-flit-core \ 19 | python-installer \ 20 | python-hatchling \ 21 | python-markdown-it-py \ 22 | python-setuptools \ 23 | python-wheel \ 24 | sudo \ 25 | && \ 26 | pacman --noconfirm -S --needed git && \ 27 | echo "%wheel ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \ 28 | useradd build -G wheel -m && \ 29 | su - build -c "git clone https://aur.archlinux.org/pikaur.git /tmp/pikaur" && \ 30 | su - build -c "cd /tmp/pikaur && makepkg -f" && \ 31 | pacman --noconfirm -U /tmp/pikaur/pikaur-*.pkg.tar.zst 32 | 33 | # Auto add PGP keys for users 34 | RUN mkdir -p /etc/gnupg/ && echo -e "keyserver-options auto-key-retrieve" >> /etc/gnupg/gpg.conf 35 | 36 | # Add a fake systemd-run script to workaround pikaur requirement. 37 | RUN echo -e "#!/bin/bash\nif [[ \"$1\" == \"--version\" ]]; then echo 'fake 244 version'; fi\nmkdir -p /var/cache/pikaur\n" >> /usr/bin/systemd-run && \ 38 | chmod +x /usr/bin/systemd-run 39 | 40 | # substitute check with !check to avoid running software from AUR in the build machine 41 | # also remove creation of debug packages. 42 | RUN sed -i '/BUILDENV/s/check/!check/g' /etc/makepkg.conf && \ 43 | sed -i '/OPTIONS/s/debug/!debug/g' /etc/makepkg.conf 44 | 45 | COPY manifest /manifest 46 | # Freeze packages and overwrite with overrides when needed 47 | RUN source /manifest && \ 48 | echo "Server=https://archive.archlinux.org/repos/${ARCHIVE_DATE}/\$repo/os/\$arch" > /etc/pacman.d/mirrorlist && \ 49 | pacman --noconfirm -Syyuu; if [ -n "${PACKAGE_OVERRIDES}" ]; then wget --directory-prefix=/tmp/extra_pkgs ${PACKAGE_OVERRIDES}; pacman --noconfirm -U --overwrite '*' /tmp/extra_pkgs/*; rm -rf /tmp/extra_pkgs; fi 50 | 51 | USER build 52 | ENV BUILD_USER "build" 53 | ENV GNUPGHOME "/etc/pacman.d/gnupg" 54 | # Built image will be moved here. This should be a host mount to get the output. 55 | ENV OUTPUT_DIR /output 56 | 57 | WORKDIR /workdir 58 | -------------------------------------------------------------------------------- /rootfs/usr/bin/gnome-session-oneshot: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | die() { echo >&2 "!! $*"; exit 1; } 6 | 7 | SENTINEL_FILE="steamos-session-select" 8 | RETURN_SESSION_FILE="chimeraos-session-return" 9 | 10 | # If we proceed, execute this 11 | CHAINED_SESSION="/usr/bin/gnome-session" 12 | # If we decide the sentinel is consumed, execute this command instead and fail 13 | RESTORE_SESSION=(/usr/lib/os-session-select) # No arguments restores the session 14 | 15 | # Find or check config return session 16 | function check_return() 17 | { 18 | if [[ -z ${HOME+x} ]]; then 19 | echo >&2 "$0: No \$HOME variable!" 20 | # Rather than break we'll just launch plasma and hope for the best? 21 | return 0 22 | fi 23 | local config_dir="${XDG_CONF_DIR:-"$HOME/.config"}" 24 | ( 25 | cd "$HOME" 26 | cd "$config_dir" 27 | revert_value="$(cat "$RETURN_SESSION_FILE")" 28 | case "$revert_value" in 29 | gamescope-session-opengamepadui|gamescope-session-steam-plus|gamescope-session-steam) 30 | echo "$revert_value" 31 | ;; 32 | *) 33 | echo "gamescope-session-steam-plus" 34 | ;; 35 | esac 36 | rm "$RETURN_SESSION_FILE" 37 | ) || return 1 # If we couldn't read the value or it wasn't what we wanted 38 | 39 | # Found value and removed it, we're good to continue 40 | return 0 41 | } 42 | 43 | # Find or check config sentinel 44 | function check_sentinel() 45 | { 46 | if [[ -z ${HOME+x} ]]; then 47 | echo >&2 "$0: No \$HOME variable!" 48 | # Rather than break we'll just launch plasma and hope for the best? 49 | return 0 50 | fi 51 | 52 | local config_dir="${XDG_CONF_DIR:-"$HOME/.config"}" 53 | ( 54 | cd "$HOME" 55 | cd "$config_dir" 56 | sentinel_value="$(cat "$SENTINEL_FILE")" 57 | if [[ "$sentinel_value" == "wayland" ]]; then 58 | echo "/usr/bin/gnome-session" 59 | else 60 | return 1 61 | fi 62 | rm "$SENTINEL_FILE" 63 | 64 | ) || return 1 # If we couldn't read the value or it wasn't what we wanted 65 | 66 | # Found value and removed it, we're good to continue 67 | return 0 68 | } 69 | 70 | if CONFIGURED_CHAINED_SESSION=$(check_sentinel); then 71 | # We found and consumed the oneshot sentinel, proceed to launch plasma 72 | echo >&2 "$0: Found and removed sentinel file for one-shot desktop, proceeding to launch" 73 | exec "$CONFIGURED_CHAINED_SESSION" 74 | else 75 | if CONFIGURED_RETURN_SESSION=$(check_return); then 76 | /usr/lib/os-session-select "$CONFIGURED_RETURN_SESSION" 77 | fi 78 | # Session restore should've stopped us, if it is broken at least let plasma continue to open 79 | 80 | echo >&2 "$0: Sentinel value not found, executing session-select to restore session" 81 | "${RESTORE_SESSION[@]}" || echo >&2 "$0: !! Failed to restore previous session, executing chained session" 82 | # Session restore should've stopped us, if it is broken at least let plasma continue to open 83 | exec "$CHAINED_SESSION" 84 | fi 85 | -------------------------------------------------------------------------------- /.github/workflows/build-system-image.yml: -------------------------------------------------------------------------------- 1 | name: Build ChimeraOS image 2 | env: 3 | REGISTRY: ghcr.io 4 | IMAGE_NAME: ${{ github.repository }} 5 | 6 | on: 7 | workflow_call: 8 | inputs: 9 | postfix: 10 | type: string 11 | description: Postfix used in release. 12 | default: '' 13 | 14 | jobs: 15 | build-system-image: 16 | runs-on: ubuntu-latest 17 | permissions: 18 | contents: write 19 | outputs: 20 | version: ${{ steps.build_image.outputs.version }} 21 | display_name: ${{ steps.build_image.outputs.display_name }} 22 | display_version: ${{ steps.build_image.outputs.display_version }} 23 | image_filename: ${{ steps.build_image.outputs.image_filename }} 24 | steps: 25 | - name: Maximize build space 26 | run: | 27 | df -h 28 | sudo rm -rf /usr/share/dotnet 29 | sudo rm -rf /usr/share/swift 30 | sudo rm -rf /usr/share/java 31 | sudo rm -rf /usr/local/lib/android 32 | sudo rm -rf /opt/ghc 33 | sudo rm -rf /opt/hostedtoolcache 34 | sudo rm -rf /opt/az 35 | df -h 36 | - uses: actions/checkout@v4 37 | - name: Extract metadata (tags, labels) for Docker 38 | id: meta 39 | uses: docker/metadata-action@v5 40 | with: 41 | images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} 42 | - uses: actions/download-artifact@v4 43 | with: 44 | pattern: AUR-packages* 45 | merge-multiple: true 46 | path: aur-pkgs/ 47 | - uses: actions/download-artifact@v4 48 | with: 49 | pattern: Packages* 50 | merge-multiple: true 51 | path: pkgs/ 52 | - name: Build system image 53 | id: build_image 54 | run: | 55 | docker pull ${{ steps.meta.outputs.tags }} 56 | docker run -u root --rm --entrypoint=/workdir/build-image.sh -v $(pwd):/workdir -v $(pwd)/output:/output -v $GITHUB_OUTPUT:$GITHUB_OUTPUT -e "GITHUB_OUTPUT=$GITHUB_OUTPUT" --privileged=true ${{ steps.meta.outputs.tags }} $(echo ${GITHUB_SHA} | cut -c1-7) 57 | echo -e "$(docker inspect --format='{{index .RepoDigests 0}}' ${{ steps.meta.outputs.tags }})" > output/container.txt 58 | - name: Create release 59 | id: create_release 60 | uses: softprops/action-gh-release@v2 61 | with: 62 | token: ${{ secrets.GITHUB_TOKEN }} 63 | tag_name: ${{ steps.build_image.outputs.version }} 64 | target_commitish: ${{ github.sha }} 65 | name: ${{ steps.build_image.outputs.display_name }} ${{ steps.build_image.outputs.display_version }} ${{ inputs.postfix }} 66 | draft: false 67 | prerelease: true 68 | fail_on_unmatched_files: true 69 | files: | 70 | output/${{ steps.build_image.outputs.image_filename }} 71 | output/build_info.txt 72 | output/sha256sum.txt 73 | output/container.txt -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: System image build 2 | 3 | env: 4 | REGISTRY: ghcr.io 5 | IMAGE_NAME: ${{ github.repository }} 6 | 7 | on: 8 | push: 9 | branches: 10 | - master 11 | workflow_dispatch: 12 | 13 | jobs: 14 | build-docker-image: 15 | name: Build and publish docker container 16 | uses: ./.github/workflows/build-builder.yml 17 | 18 | list-pkgbuilds: 19 | name: List Packages 20 | runs-on: ubuntu-latest 21 | outputs: 22 | aur-pkgs: ${{ steps.set-aur-pkgs.outputs.matrix }} 23 | pkgs: ${{ steps.set-pkgs.outputs.matrix }} 24 | steps: 25 | - uses: actions/checkout@v4 26 | - id: set-aur-pkgs 27 | run: source ./manifest ; echo "matrix=$(echo ${AUR_PACKAGES} | jq -R -s -c 'split(" ")')" >> $GITHUB_OUTPUT 28 | shell: bash 29 | - id: set-pkgs 30 | run: echo "matrix=$(ls -d pkgs/*/ | jq -R -s -c 'split("\n")[:-1]')" >> $GITHUB_OUTPUT 31 | shell: bash 32 | 33 | aur-pkgbuild: 34 | needs: 35 | - build-docker-image 36 | - list-pkgbuilds 37 | name: Build AUR package 38 | runs-on: ubuntu-latest 39 | strategy: 40 | fail-fast: true 41 | matrix: 42 | package: ${{ fromJson(needs.list-pkgbuilds.outputs.aur-pkgs) }} 43 | steps: 44 | - uses: actions/checkout@v4 45 | - name: Extract metadata (tags, labels) for Docker 46 | id: meta 47 | uses: docker/metadata-action@v5 48 | with: 49 | images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} 50 | - name: Build packages 51 | run: | 52 | docker pull ${{ steps.meta.outputs.tags }} 53 | docker run --rm -v $(pwd):/workdir --entrypoint=/workdir/aur-pkgs/build-aur-package.sh ${{ steps.meta.outputs.tags }} ${{ matrix.package }} 54 | - name: Upload Package Archives 55 | uses: actions/upload-artifact@v4 56 | with: 57 | name: AUR-packages-${{ matrix.package }} 58 | path: aur-pkgs/*.pkg.tar* 59 | 60 | pkgbuild: 61 | needs: 62 | - build-docker-image 63 | - list-pkgbuilds 64 | name: Build package 65 | runs-on: ubuntu-latest 66 | strategy: 67 | fail-fast: true 68 | matrix: 69 | package: ${{ fromJson(needs.list-pkgbuilds.outputs.pkgs) }} 70 | steps: 71 | - uses: actions/checkout@v4 72 | - name: Extract metadata (tags, labels) for Docker 73 | id: meta 74 | uses: docker/metadata-action@v5 75 | with: 76 | images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} 77 | - name: Build packages 78 | run: | 79 | docker pull ${{ steps.meta.outputs.tags }} 80 | docker run --rm -v $(pwd):/workdir --entrypoint=/workdir/pkgs/build-package.sh ${{ steps.meta.outputs.tags }} ${{ matrix.package }} 81 | - name: Upload Package Archives 82 | uses: actions/upload-artifact@v4 83 | with: 84 | name: Packages-${{ hashFiles(format('{0}/PKGBUILD', matrix.package)) }} 85 | path: pkgs/*.pkg.tar* 86 | 87 | build: 88 | needs: 89 | - build-docker-image 90 | - aur-pkgbuild 91 | - pkgbuild 92 | name: Build ChimeraOS UNSTABLE image 93 | uses: ./.github/workflows/build-system-image.yml 94 | with: 95 | postfix: "[UNSTABLE]" -------------------------------------------------------------------------------- /rootfs/etc/pacman.conf: -------------------------------------------------------------------------------- 1 | # 2 | # /etc/pacman.conf 3 | # 4 | # See the pacman.conf(5) manpage for option and repository directives 5 | 6 | # 7 | # GENERAL OPTIONS 8 | # 9 | [options] 10 | # The following paths are commented out with their default values listed. 11 | # If you wish to use different paths, uncomment and update the paths. 12 | #RootDir = / 13 | #DBPath = /var/lib/pacman/ 14 | #CacheDir = /var/cache/pacman/pkg/ 15 | #LogFile = /var/log/pacman.log 16 | #GPGDir = /etc/pacman.d/gnupg/ 17 | #HookDir = /etc/pacman.d/hooks/ 18 | HoldPkg = pacman glibc 19 | #XferCommand = /usr/bin/curl -L -C - -f -o %o %u 20 | #XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u 21 | #CleanMethod = KeepInstalled 22 | Architecture = auto 23 | 24 | # Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup 25 | #IgnorePkg = 26 | #IgnoreGroup = 27 | 28 | #NoUpgrade = 29 | #NoExtract = 30 | 31 | # Misc options 32 | #UseSyslog 33 | #Color 34 | #NoProgressBar 35 | CheckSpace 36 | #VerbosePkgLists 37 | ParallelDownloads = 5 38 | 39 | # By default, pacman accepts packages signed by keys that its local keyring 40 | # trusts (see pacman-key and its man page), as well as unsigned packages. 41 | SigLevel = Required DatabaseOptional 42 | LocalFileSigLevel = Optional 43 | #RemoteFileSigLevel = Required 44 | 45 | # NOTE: You must run `pacman-key --init` before first using pacman; the local 46 | # keyring can then be populated with the keys of all official Arch Linux 47 | # packagers with `pacman-key --populate archlinux`. 48 | 49 | # 50 | # REPOSITORIES 51 | # - can be defined here or included from another file 52 | # - pacman will search repositories in the order defined here 53 | # - local/custom mirrors can be added here or in separate files 54 | # - repositories listed first will take precedence when packages 55 | # have identical names, regardless of version number 56 | # - URLs will have $repo replaced by the name of the current repo 57 | # - URLs will have $arch replaced by the name of the architecture 58 | # 59 | # Repository entries are of the format: 60 | # [repo-name] 61 | # Server = ServerName 62 | # Include = IncludePath 63 | # 64 | # The header [repo-name] is crucial - it must be present and 65 | # uncommented to enable the repo. 66 | # 67 | 68 | # The testing repositories are disabled by default. To enable, uncomment the 69 | # repo name header and Include lines. You can add preferred servers immediately 70 | # after the header, and they will be used before the default mirrors. 71 | 72 | #[core-testing] 73 | #Include = /etc/pacman.d/mirrorlist 74 | 75 | [core] 76 | Include = /etc/pacman.d/mirrorlist 77 | 78 | #[extra-testing] 79 | #Include = /etc/pacman.d/mirrorlist 80 | 81 | [extra] 82 | Include = /etc/pacman.d/mirrorlist 83 | 84 | # If you want to run 32 bit applications on your x86_64 system, 85 | # enable the multilib repositories as required here. 86 | 87 | #[multilib-testing] 88 | #Include = /etc/pacman.d/mirrorlist 89 | 90 | [multilib] 91 | Include = /etc/pacman.d/mirrorlist 92 | 93 | # An example of a custom package repository. See the pacman manpage for 94 | # tips on creating your own repositories. 95 | #[custom] 96 | #SigLevel = Optional TrustAll 97 | #Server = file:///home/custompkgs 98 | -------------------------------------------------------------------------------- /.github/workflows/stable.yml: -------------------------------------------------------------------------------- 1 | name: System image build - stable 2 | 3 | env: 4 | REGISTRY: ghcr.io 5 | IMAGE_NAME: ${{ github.repository }} 6 | 7 | on: 8 | push: 9 | branches: 10 | - 'stable-**' 11 | workflow_dispatch: 12 | 13 | jobs: 14 | build-docker-image: 15 | name: Build and publish docker container 16 | uses: ./.github/workflows/build-builder.yml 17 | 18 | list-pkgbuilds: 19 | name: List Packages 20 | runs-on: ubuntu-latest 21 | outputs: 22 | aur-pkgs: ${{ steps.set-aur-pkgs.outputs.matrix }} 23 | pkgs: ${{ steps.set-pkgs.outputs.matrix }} 24 | steps: 25 | - uses: actions/checkout@v4 26 | with: 27 | submodules: recursive 28 | - id: set-aur-pkgs 29 | run: echo "matrix=$(ls -d aur-pkgs/*/ | jq -R -s -c 'split("\n")[:-1]')" >> $GITHUB_OUTPUT 30 | shell: bash 31 | - id: set-pkgs 32 | run: echo "matrix=$(ls -d pkgs/*/ | jq -R -s -c 'split("\n")[:-1]')" >> $GITHUB_OUTPUT 33 | shell: bash 34 | 35 | aur-pkgbuild: 36 | needs: 37 | - build-docker-image 38 | - list-pkgbuilds 39 | name: Build AUR package 40 | runs-on: ubuntu-latest 41 | strategy: 42 | fail-fast: true 43 | matrix: 44 | package: ${{ fromJson(needs.list-pkgbuilds.outputs.aur-pkgs) }} 45 | steps: 46 | - uses: actions/checkout@v4 47 | with: 48 | submodules: recursive 49 | - name: Extract metadata (tags, labels) for Docker 50 | id: meta 51 | uses: docker/metadata-action@v5 52 | with: 53 | images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} 54 | - name: Build packages 55 | run: | 56 | docker pull ${{ steps.meta.outputs.tags }} 57 | docker run --rm -v $(pwd):/workdir --entrypoint=/workdir/aur-pkgs/build-package.sh ${{ steps.meta.outputs.tags }} ${{ matrix.package }} 58 | - name: Upload Package Archives 59 | uses: actions/upload-artifact@v4 60 | with: 61 | name: AUR-packages-${{ hashFiles(format('{0}/PKGBUILD', matrix.package)) }} 62 | path: aur-pkgs/*.pkg.tar* 63 | 64 | pkgbuild: 65 | needs: 66 | - build-docker-image 67 | - list-pkgbuilds 68 | name: Build package 69 | runs-on: ubuntu-latest 70 | strategy: 71 | fail-fast: true 72 | matrix: 73 | package: ${{ fromJson(needs.list-pkgbuilds.outputs.pkgs) }} 74 | steps: 75 | - uses: actions/checkout@v4 76 | - name: Extract metadata (tags, labels) for Docker 77 | id: meta 78 | uses: docker/metadata-action@v5 79 | with: 80 | images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} 81 | - name: Build packages 82 | run: | 83 | docker pull ${{ steps.meta.outputs.tags }} 84 | docker run --rm -v $(pwd):/workdir --entrypoint=/workdir/pkgs/build-package.sh ${{ steps.meta.outputs.tags }} ${{ matrix.package }} 85 | - name: Upload Package Archives 86 | uses: actions/upload-artifact@v4 87 | with: 88 | name: Packages-${{ hashFiles(format('{0}/PKGBUILD', matrix.package)) }} 89 | path: pkgs/*.pkg.tar* 90 | 91 | build: 92 | needs: 93 | - build-docker-image 94 | - aur-pkgbuild 95 | - pkgbuild 96 | name: Build ChimeraOS STABLE image 97 | uses: ./.github/workflows/build-system-image.yml 98 | -------------------------------------------------------------------------------- /rootfs/usr/lib/os-session-select: -------------------------------------------------------------------------------- 1 | #! /usr/bin/bash 2 | 3 | set -e 4 | 5 | die() { 6 | echo >&2 "!! $*" 7 | exit 1 8 | } 9 | 10 | CONF_FILE="/etc/lightdm/lightdm.conf.d/10-chimeraos-session.conf" 11 | SENTINEL_FILE="steamos-session-select" 12 | RETURN_SESSION_FILE="chimeraos-session-return" 13 | 14 | # For sanity this shipped file must be present, to ensure we're still on a normal-looking Chimeraos setup. 15 | CHECK_FILE="/etc/lightdm/lightdm.conf.d/10-chimeraos-session.conf" 16 | 17 | session="${1:-gamescope-session-steam-plus}" 18 | session_type="wayland" 19 | 20 | session_launcher="gamescope-session-steam-plus" 21 | create_sentinel="" 22 | 23 | if [[ "$2" == "--sentinel-created" ]]; then 24 | SENTINEL_CREATED=1 25 | session_type="wayland" 26 | fi 27 | 28 | # Update config sentinel 29 | if [[ -z $SENTINEL_CREATED ]]; then 30 | [[ $EUID == 0 ]] && die "Running $0 as root is not allowed" 31 | 32 | [[ -n ${HOME+x} ]] || die "No \$HOME variable" 33 | config_dir="${XDG_CONF_DIR:-"$HOME/.config"}" 34 | session_type=$( 35 | cd "$HOME" 36 | mkdir -p "$config_dir" 37 | cd "$config_dir" 38 | if [[ -f "steamos-session-type" ]]; then 39 | cp steamos-session-type "$SENTINEL_FILE" 40 | else 41 | echo "wayland" >"$SENTINEL_FILE" 42 | fi 43 | cat "$SENTINEL_FILE" 44 | ) 45 | 46 | return_session=$(grep autologin-session $CONF_FILE | cut -d = -f 2) 47 | return_session=$( 48 | cd "$HOME" 49 | mkdir -p "$config_dir" 50 | cd "$config_dir" 51 | echo "$return_session" >"$RETURN_SESSION_FILE" 52 | cat "$RETURN_SESSION_FILE" 53 | ) 54 | 55 | # clear steam game desktop shortcut clutter 56 | DATA_HOME=${XDG_DATA_HOME:-$HOME/.local/share} 57 | grep -r --files-with-matches "Exec=steam steam://rungameid/" "${DATA_HOME}"/applications/ | tr '\n' '\0' | xargs -0 -I {} rm {} || true 58 | 59 | # If we were executed as a session user and then re-execute as root below, we don't want to set root's sentinel too 60 | export SENTINEL_CREATED=1 61 | fi 62 | 63 | # We use "plasma" as "desktop" to hook up to SteamOS's scripts 64 | case "$session" in 65 | plasma-wayland-persistent) 66 | session_launcher="gnome-session" 67 | ;; 68 | plasma-x11-persistent) 69 | session_launcher="gnome-session" 70 | ;; 71 | desktop | plasma) 72 | session_launcher="gnome-session-oneshot" 73 | create_sentinel=1 74 | if (systemctl -q is-active inputplumber.service); then 75 | sudo systemctl restart inputplumber || true 76 | fi 77 | ;; 78 | opengamepadui | gamescope-session-opengamepadui) 79 | session_launcher="gamescope-session-opengamepadui" 80 | create_sentinel=1 81 | ;; 82 | steam-plus | gamescope-session-steam-plus) 83 | session_launcher="gamescope-session-steam-plus" 84 | create_sentinel=1 85 | ;; 86 | steam | gamescope-session-steam) 87 | session_launcher="gamescope-session-steam" 88 | create_sentinel=1 89 | ;; 90 | *) 91 | echo >&2 "!! Unrecognized session '$session'" 92 | exit 1 93 | ;; 94 | esac 95 | 96 | echo "Updated user selected session to $session_launcher" 97 | 98 | # Become root 99 | if [[ $EUID != 0 ]]; then 100 | exec pkexec "$(realpath $0)" "$session" --sentinel-created 101 | exit 1 102 | fi 103 | 104 | { 105 | echo "[Seat:*]" 106 | echo "autologin-session=$session_launcher" 107 | } >"$CONF_FILE" 108 | 109 | echo "Updated system autologin session to $session_launcher" 110 | systemctl reset-failed lightdm 111 | systemctl restart lightdm 112 | echo "Restarted LightDM" 113 | -------------------------------------------------------------------------------- /rootfs/usr/bin/chimera-session: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | DATA_HOME=${XDG_DATA_HOME:-$HOME/.local/share} 4 | CONFIG_HOME=${XDG_CONFIG_HOME:-$HOME/.config} 5 | SESSION_CONFIG="${CONFIG_HOME}/environment.d/01-chimera-session.conf" 6 | SESSION_LIGHTDM_CONFIG="/etc/lightdm/lightdm.conf.d/10-chimeraos-session.conf" 7 | SESSION_LIST=('desktop' 'desktop-xorg' 'steam' 'steam-plus' 'opengamepadui') 8 | SELECTED_SESSION="$1" 9 | 10 | mkdir -p "${CONFIG_HOME}/environment.d" 11 | 12 | function print_session_list() { 13 | # detect active session 14 | CURRENT_SESSION="unknown" 15 | if grep "gnome" ${SESSION_LIGHTDM_CONFIG} &>/dev/null; then 16 | CURRENT_SESSION="desktop" 17 | fi 18 | 19 | if grep "gnome-xorg" ${SESSION_LIGHTDM_CONFIG} &>/dev/null; then 20 | CURRENT_SESSION="desktop-xorg" 21 | fi 22 | 23 | if grep "gamescope-session-steam" ${SESSION_LIGHTDM_CONFIG} &>/dev/null; then 24 | CURRENT_SESSION="steam" 25 | fi 26 | 27 | if grep "gamescope-session-steam-plus" ${SESSION_LIGHTDM_CONFIG} &>/dev/null; then 28 | CURRENT_SESSION="steam-plus" 29 | fi 30 | 31 | if grep "gamescope-session-opengamepadui" ${SESSION_LIGHTDM_CONFIG} &>/dev/null; then 32 | CURRENT_SESSION="opengamepadui" 33 | fi 34 | 35 | # print active and available sessions 36 | for t in ${SESSION_LIST[@]}; do 37 | if [ "${CURRENT_SESSION}" = "${t}" ]; then 38 | echo "* $t" 39 | else 40 | echo " $t" 41 | fi 42 | done 43 | } 44 | 45 | function clean_steam_shortcuts() { 46 | # clear steam game desktop shortcut clutter 47 | grep -r --files-with-matches "Exec=steam steam://rungameid/" ${DATA_HOME}/applications/ | tr '\n' '\0' | xargs -0 -I {} rm {} 48 | } 49 | 50 | function desktop() { 51 | clean_steam_shortcuts 52 | 53 | # switch to Desktop 54 | sudo chimera-session-use-lightdm gnome-wayland 55 | if (systemctl -q is-active inputplumber.service); then 56 | sudo systemctl restart inputplumber || true 57 | fi 58 | } 59 | 60 | function desktop_xorg() { 61 | clean_steam_shortcuts 62 | 63 | # switch to Desktop (Xorg) 64 | sudo chimera-session-use-lightdm gnome-xorg 65 | if (systemctl -q is-active inputplumber.service); then 66 | sudo systemctl restart inputplumber || true 67 | fi 68 | } 69 | 70 | function gamescope_steam() { 71 | # switch to Steam Big Picture UI (Gamescope/Wayland) 72 | echo '' >${SESSION_CONFIG} 73 | sudo chimera-session-use-lightdm gamescope-session-steam 74 | } 75 | 76 | function gamescope_opengamepadui() { 77 | # switch to OpengamepadUI (Gamescope/Wayland) 78 | echo '' >${SESSION_CONFIG} 79 | sudo chimera-session-use-lightdm gamescope-session-opengamepadui 80 | } 81 | 82 | function gamescope_steam_plus() { 83 | # switch to Steam plus OpengamepadUI overlay (Gamescope/Wayland) 84 | echo '' >${SESSION_CONFIG} 85 | sudo chimera-session-use-lightdm gamescope-session-steam-plus 86 | } 87 | 88 | function print_invalid_session() { 89 | echo "Unknown or invalid session type: ${SELECTED_SESSION}" 90 | echo 91 | echo "Available session types:" 92 | print_session_list 93 | } 94 | 95 | # print current and available sessions when no argument specified 96 | if [ -z "${SELECTED_SESSION}" ]; then 97 | print_session_list 98 | exit 99 | fi 100 | 101 | # print message when invalid session is specified 102 | if [[ ! "${SESSION_LIST[*]}" =~ "${SELECTED_SESSION}" ]]; then 103 | print_invalid_session 104 | exit 105 | fi 106 | 107 | # apply the specified session type 108 | if [ "${SELECTED_SESSION}" = "desktop" ]; then 109 | echo "Switching to desktop session" 110 | desktop 111 | elif [ "${SELECTED_SESSION}" = "desktop-xorg" ]; then 112 | echo "Switching to desktop-xorg session" 113 | desktop_xorg 114 | elif [ "${SELECTED_SESSION}" = "steam" ]; then 115 | echo "Switching to steam session" 116 | gamescope_steam 117 | elif [ "${SELECTED_SESSION}" = "opengamepadui" ]; then 118 | echo "Switching to opengamepadui session" 119 | gamescope_opengamepadui 120 | elif [ "${SELECTED_SESSION}" = "steam-plus" ]; then 121 | echo "Switching to steam-plus session" 122 | gamescope_steam_plus 123 | fi 124 | -------------------------------------------------------------------------------- /rootfs/usr/share/wireplumber/main.lua.d/50-alsa-config.lua: -------------------------------------------------------------------------------- 1 | alsa_monitor.enabled = true 2 | 3 | alsa_monitor.properties = { 4 | -- Create a JACK device. This is not enabled by default because 5 | -- it requires that the PipeWire JACK replacement libraries are 6 | -- not used by the session manager, in order to be able to 7 | -- connect to the real JACK server. 8 | --["alsa.jack-device"] = false, 9 | 10 | -- Reserve devices via org.freedesktop.ReserveDevice1 on D-Bus 11 | -- Disable if you are running a system-wide instance, which 12 | -- doesn't have access to the D-Bus user session 13 | ["alsa.reserve"] = true, 14 | --["alsa.reserve.priority"] = -20, 15 | --["alsa.reserve.application-name"] = "WirePlumber", 16 | 17 | -- Enables MIDI functionality 18 | ["alsa.midi"] = true, 19 | 20 | -- Enables monitoring of alsa MIDI devices 21 | ["alsa.midi.monitoring"] = true, 22 | 23 | -- MIDI bridge node properties 24 | ["alsa.midi.node-properties"] = { 25 | -- Name set for the node with ALSA MIDI ports 26 | ["node.name"] = "Midi-Bridge", 27 | -- Removes longname/number from MIDI port names 28 | --["api.alsa.disable-longname"] = true, 29 | }, 30 | 31 | -- These properties override node defaults when running in a virtual machine. 32 | -- The rules below still override those. 33 | ["vm.node.defaults"] = { 34 | ["api.alsa.period-size"] = 256, 35 | ["api.alsa.headroom"] = 8192, 36 | }, 37 | } 38 | 39 | alsa_monitor.rules = { 40 | -- An array of matches/actions to evaluate. 41 | -- 42 | -- If you want to disable some devices or nodes, you can apply properties per device as the following example. 43 | -- The name can be found by running pw-cli ls Device, or pw-cli dump Device 44 | --{ 45 | -- matches = { 46 | -- { 47 | -- { "device.name", "matches", "name_of_some_disabled_card" }, 48 | -- }, 49 | -- }, 50 | -- apply_properties = { 51 | -- ["device.disabled"] = true, 52 | -- }, 53 | --} 54 | { 55 | -- Rules for matching a device or node. It is an array of 56 | -- properties that all need to match the regexp. If any of the 57 | -- matches work, the actions are executed for the object. 58 | matches = { 59 | { 60 | -- This matches all cards. 61 | { "device.name", "matches", "alsa_card.*" }, 62 | }, 63 | }, 64 | -- Apply properties on the matched object. 65 | apply_properties = { 66 | -- Use ALSA-Card-Profile devices. They use UCM or the profile 67 | -- configuration to configure the device and mixer settings. 68 | ["api.alsa.use-acp"] = true, 69 | 70 | -- Use UCM instead of profile when available. Can be 71 | -- disabled to skip trying to use the UCM profile. 72 | --["api.alsa.use-ucm"] = true, 73 | 74 | -- Don't use the hardware mixer for volume control. It 75 | -- will only use software volume. The mixer is still used 76 | -- to mute unused paths based on the selected port. 77 | --["api.alsa.soft-mixer"] = false, 78 | 79 | -- Ignore decibel settings of the driver. Can be used to 80 | -- work around buggy drivers that report wrong values. 81 | --["api.alsa.ignore-dB"] = false, 82 | 83 | -- The profile set to use for the device. Usually this is 84 | -- "default.conf" but can be changed with a udev rule or here. 85 | --["device.profile-set"] = "profileset-name", 86 | 87 | -- The default active profile. Is by default set to "Off". 88 | --["device.profile"] = "default profile name", 89 | 90 | -- Automatically select the best profile. This is the 91 | -- highest priority available profile. This is disabled 92 | -- here and instead implemented in the session manager 93 | -- where it can save and load previous preferences. 94 | ["api.acp.auto-profile"] = false, 95 | 96 | -- Automatically switch to the highest priority available port. 97 | -- This is disabled here and implemented in the session manager instead. 98 | ["api.acp.auto-port"] = false, 99 | 100 | -- Other properties can be set here. 101 | --["device.nick"] = "My Device", 102 | }, 103 | }, 104 | { 105 | matches = { 106 | { 107 | -- Matches all sources. 108 | { "node.name", "matches", "alsa_input.*" }, 109 | }, 110 | { 111 | -- Matches all sinks. 112 | { "node.name", "matches", "alsa_output.*" }, 113 | }, 114 | }, 115 | apply_properties = { 116 | --["node.nick"] = "My Node", 117 | --["node.description"] = "My Node Description", 118 | --["priority.driver"] = 100, 119 | --["priority.session"] = 100, 120 | --["node.pause-on-idle"] = false, 121 | --["monitor.channel-volumes"] = false 122 | --["resample.quality"] = 4, 123 | --["resample.disable"] = false, 124 | --["channelmix.normalize"] = false, 125 | --["channelmix.mix-lfe"] = false, 126 | --["channelmix.upmix"] = true, 127 | --["channelmix.upmix-method"] = "psd", -- "none" or "simple" 128 | --["channelmix.lfe-cutoff"] = 150, 129 | --["channelmix.fc-cutoff"] = 12000, 130 | --["channelmix.rear-delay"] = 12.0, 131 | --["channelmix.stereo-widen"] = 0.0, 132 | --["channelmix.hilbert-taps"] = 0, 133 | --["channelmix.disable"] = false, 134 | --["dither.noise"] = 0, 135 | --["dither.method"] = "none", -- "rectangular", "triangular" or "shaped5" 136 | --["audio.channels"] = 2, 137 | --["audio.format"] = "S16LE", 138 | --["audio.rate"] = 44100, 139 | --["audio.allowed-rates"] = "32000,96000", 140 | --["audio.position"] = "FL,FR", 141 | --["api.alsa.period-size"] = 1024, 142 | --["api.alsa.period-num"] = 2, 143 | --["api.alsa.headroom"] = 1024, 144 | --["api.alsa.start-delay"] = 0, 145 | --["api.alsa.disable-mmap"] = false, 146 | --["api.alsa.disable-batch"] = false, 147 | --["api.alsa.use-chmap"] = false, 148 | --["api.alsa.multirate"] = true, 149 | --["latency.internal.rate"] = 0 150 | --["latency.internal.ns"] = 0 151 | --["clock.name"] = "api.alsa.0" 152 | --["session.suspend-timeout-seconds"] = 0, -- 0 disables suspend 153 | }, 154 | }, 155 | } 156 | -------------------------------------------------------------------------------- /manifest: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | export VERSION="50" 4 | export SYSTEM_DESC="ChimeraOS" 5 | export SYSTEM_NAME="chimeraos" 6 | export USERNAME="gamer" 7 | export SIZE="12000MB" 8 | export ARCHIVE_DATE=$(date -d 'yesterday' +%Y/%m/%d) 9 | export WEBSITE="https://chimeraos.org" 10 | export DOCUMENTATION_URL="https://chimeraos.org/about" 11 | export BUG_REPORT_URL="https://github.com/ChimeraOS/chimeraos/issues" 12 | 13 | export KERNEL_PACKAGE="linux" 14 | export KERNEL_PACKAGE_ORIGIN="repo" 15 | 16 | export PACKAGES="\ 17 | accountsservice \ 18 | acpi_call-dkms \ 19 | acsccid \ 20 | alsa-firmware \ 21 | alsa-utils \ 22 | amd-debug-tools \ 23 | amd-ucode \ 24 | bash-completion \ 25 | broadcom-wl-dkms \ 26 | bzip2 \ 27 | cifs-utils \ 28 | cpupower \ 29 | diffutils \ 30 | dkms \ 31 | distrobox \ 32 | dmidecode \ 33 | dosbox \ 34 | efibootmgr \ 35 | epiphany \ 36 | ethtool \ 37 | evtest \ 38 | fakeroot \ 39 | ffmpeg \ 40 | file \ 41 | ffmpegthumbnailer \ 42 | firejail \ 43 | flatpak \ 44 | fmt \ 45 | fuse-zip \ 46 | fuse2 \ 47 | fwupd \ 48 | gamescope \ 49 | git \ 50 | gnome-browser-connector \ 51 | gnome-console \ 52 | gnome-control-center \ 53 | gnome-disk-utility \ 54 | gnome-keyring \ 55 | gnome-menus \ 56 | gnome-session \ 57 | gnome-shell \ 58 | gnome-software \ 59 | gnome-system-monitor \ 60 | gnome-text-editor \ 61 | gnome-tweaks \ 62 | gst-plugin-pipewire \ 63 | gvfs-smb \ 64 | gvfs-nfs \ 65 | gzip \ 66 | htop \ 67 | intel-gpu-tools \ 68 | inputplumber \ 69 | intel-media-driver \ 70 | intel-ucode \ 71 | intel-undervolt \ 72 | less \ 73 | lib32-curl \ 74 | lib32-fontconfig \ 75 | lib32-freetype2 \ 76 | lib32-libgpg-error \ 77 | lib32-libnm \ 78 | lib32-libxinerama \ 79 | lib32-libxcrypt-compat \ 80 | lib32-mangohud \ 81 | lib32-openal \ 82 | lib32-pipewire \ 83 | lib32-sdl2 \ 84 | lib32-systemd \ 85 | lib32-vulkan-icd-loader \ 86 | libnfc \ 87 | libretro-beetle-pce-fast \ 88 | libretro-beetle-psx-hw \ 89 | libretro-desmume \ 90 | libretro-dolphin \ 91 | libretro-flycast \ 92 | libretro-genesis-plus-gx \ 93 | libretro-kronos \ 94 | libretro-mame \ 95 | libretro-mesen-s \ 96 | libretro-mgba \ 97 | libretro-mupen64plus-next \ 98 | libretro-nestopia \ 99 | libretro-picodrive \ 100 | libretro-ppsspp \ 101 | libretro-snes9x \ 102 | libxcrypt-compat \ 103 | libxss \ 104 | lightdm \ 105 | linux-firmware \ 106 | liquidctl \ 107 | logrotate \ 108 | lrzip \ 109 | loupe \ 110 | lshw \ 111 | mangohud \ 112 | modemmanager \ 113 | nano \ 114 | nautilus \ 115 | networkmanager \ 116 | nfs-utils \ 117 | noto-fonts-emoji \ 118 | nss-mdns \ 119 | nvidia-open-dkms \ 120 | opencl-nvidia \ 121 | lib32-opencl-nvidia \ 122 | nvidia-utils \ 123 | lib32-nvidia-utils \ 124 | nvidia-prime \ 125 | openal \ 126 | openrazer-daemon \ 127 | openssh \ 128 | p7zip \ 129 | pipewire \ 130 | pipewire-alsa \ 131 | pipewire-jack \ 132 | pipewire-pulse \ 133 | podman \ 134 | pulsemixer \ 135 | python \ 136 | python-notify2 \ 137 | python-pyscard \ 138 | qtractor \ 139 | retroarch \ 140 | rsync \ 141 | smbclient \ 142 | sof-firmware \ 143 | sshfs \ 144 | steam \ 145 | sudo \ 146 | tar \ 147 | tree \ 148 | ttf-liberation \ 149 | unace \ 150 | unrar \ 151 | unzip \ 152 | usb_modeswitch \ 153 | usbutils \ 154 | vim \ 155 | vulkan-icd-loader \ 156 | wavpack \ 157 | wget \ 158 | which \ 159 | wireplumber \ 160 | wireless-regdb \ 161 | wqy-zenhei \ 162 | xdg-desktop-portal \ 163 | xdg-desktop-portal-gnome \ 164 | xdg-desktop-portal-wlr \ 165 | xdg-user-dirs-gtk \ 166 | xf86-video-amdgpu \ 167 | xorg-server \ 168 | xz \ 169 | zip \ 170 | " 171 | 172 | # Each entry is the clone url (https://aur.archlinux.org/{AUR_PACKAGE}.git) 173 | # Which is often the same as the package name but it can be different. 174 | # Check on the AUR webpage if you are unsure 175 | export AUR_PACKAGES="\ 176 | asusctl \ 177 | ayaneo-platform-dkms-git \ 178 | ayn-platform-dkms-git \ 179 | bcm20702a1-firmware \ 180 | boxtron \ 181 | chimera \ 182 | chimeraos-device-quirks-git \ 183 | downgrade \ 184 | evdev-keepalive \ 185 | frzr \ 186 | gamescope-session-steam-git \ 187 | gpd-fan-driver-dkms-git \ 188 | hhfc-git \ 189 | hid-msi-claw-dkms-git \ 190 | legendary \ 191 | libretro-dosbox-pure-git \ 192 | libretro-lrps2-git \ 193 | libretro-opera-git \ 194 | libretro-prosystem-git \ 195 | libretro-stella2014-git \ 196 | libretro-virtualjaguar-git \ 197 | linux-firmware-valve \ 198 | kanit-font \ 199 | nintendo-udev \ 200 | pikaur \ 201 | powerstation-bin \ 202 | python-gbopyrator \ 203 | python-vdf \ 204 | rtl8812au-dkms-git \ 205 | rtl8814au-dkms-git \ 206 | rtl8821au-dkms-git \ 207 | ryzenadj-git \ 208 | steam_notif_daemon \ 209 | steam-powerbuttond-git \ 210 | steam-removable-media-git \ 211 | wyvern \ 212 | xpadneo-dkms-git \ 213 | zenergy-dkms-git \ 214 | " 215 | 216 | export SERVICES="\ 217 | NetworkManager \ 218 | avahi-daemon \ 219 | bluetooth \ 220 | bluetooth-workaround \ 221 | fstrim.timer \ 222 | home-swapfile.swap \ 223 | inputplumber \ 224 | inputplumber-suspend \ 225 | lightdm \ 226 | nvidia-powerd \ 227 | pcscd.socket \ 228 | powerstation \ 229 | steam-powerbuttond \ 230 | sshd \ 231 | systemd-timesyncd \ 232 | swapfile \ 233 | " 234 | 235 | export USER_SERVICES="\ 236 | chimera.service \ 237 | pipewire \ 238 | steam-patch.service \ 239 | chimera-cart-monitor.service \ 240 | chimera-nfc-monitor.service \ 241 | " 242 | 243 | export FILES_TO_DELETE="\ 244 | /boot/initramfs-linux-fallback.img \ 245 | /boot/initramfs-linux.img \ 246 | /usr/share/SFML \ 247 | /usr/share/doc \ 248 | /usr/share/gtk-doc \ 249 | /usr/share/help \ 250 | /usr/share/man \ 251 | /usr/share/nvidia/nvoptix.bin \ 252 | /usr/lib/libnvoptix.so* \ 253 | " 254 | 255 | postinstallhook() { 256 | # Add sudo permissions 257 | sed -i '/%wheel ALL=(ALL:ALL) ALL/s/^# //g' /etc/sudoers 258 | echo "${USERNAME} ALL=(ALL) NOPASSWD: /usr/bin/dmidecode -t 11 259 | " >/etc/sudoers.d/steam 260 | echo "${USERNAME} ALL=(ALL) NOPASSWD: /usr/bin/chimera-session-use-gamescope 261 | ${USERNAME} ALL=(ALL) NOPASSWD: /usr/bin/chimera-session-use-lightdm 262 | ${USERNAME} ALL=(ALL) NOPASSWD: /usr/share/chimera/bin/power-tool 263 | " >/etc/sudoers.d/chimera 264 | 265 | # download and add racing wheel udev rules 266 | pushd /usr/lib/udev/rules.d 267 | curl -L -O https://raw.githubusercontent.com/berarma/oversteer/master/data/udev/99-fanatec-wheel-perms.rules 268 | curl -L -O https://raw.githubusercontent.com/berarma/oversteer/master/data/udev/99-logitech-wheel-perms.rules 269 | curl -L -O https://raw.githubusercontent.com/berarma/oversteer/master/data/udev/99-thrustmaster-wheel-perms.rules 270 | popd 271 | 272 | # Remove build tools for slimmer image 273 | rm /usr/share/libalpm/hooks/70-dkms-install.hook 274 | rm /usr/share/libalpm/hooks/70-dkms-upgrade.hook 275 | rm /usr/share/libalpm/hooks/71-dkms-remove.hook 276 | pacman --noconfirm -Rnsdd make gcc dkms ${KERNEL_PACKAGE}-headers 277 | 278 | # remove dolphin shortcut to not clutter up the desktop 279 | rm /usr/share/applications/dolphin-emu.desktop 280 | 281 | # clean up desktop shortcuts 282 | sed -i -e 's/Name=Steam (Runtime)/Name=Steam/' /usr/share/applications/steam.desktop 283 | find /usr/share/applications/* | 284 | grep -v org.chimeraos.Gamescope.desktop | 285 | grep -v org.chimeraos.app.desktop | 286 | grep -v org.gnome.Console.desktop | 287 | grep -v org.gnome.DiskUtility.desktop | 288 | grep -v org.gnome.FileRoller.desktop | 289 | grep -v org.gnome.Nautilus.desktop | 290 | grep -v org.gnome.Settings.desktop | 291 | grep -v org.gnome.Software.desktop | 292 | grep -v org.gnome.TextEditor.desktop | 293 | grep -v steam.desktop | 294 | xargs -I {} sh -c "echo NoDisplay=true >> {}" 295 | 296 | # force -steamdeck option in desktop mode to prevent constant steam updates 297 | sed -i 's,Exec=/usr/bin/steam-runtime,Exec=/usr/bin/steam-runtime -steamdeck,' /usr/share/applications/steam.desktop 298 | 299 | # workaround for dosbox compatibility tool being run unnecessarily by Steam at startup 300 | sed -i 's,/run-dosbox,/run-dosbox-wrapper,' /usr/share/boxtron/toolmanifest.vdf 301 | 302 | # Disable SPDIF/IEC958 audio output to make it more likely the correct HDMI output will be selected by default 303 | sed -e '/\[Mapping iec958/,+5 s/^/#/' -i '/usr/share/alsa-card-profile/mixer/profile-sets/default.conf' 304 | 305 | # Replace wpctl with a wrapper to work around Steam resetting audio 306 | mv /usr/bin/wpctl /usr/libexec/wpctl 307 | mv /usr/bin/wpctl-wrapper /usr/bin/wpctl 308 | } 309 | -------------------------------------------------------------------------------- /rootfs/usr/share/icons/chimeraos/scalable/actions/return-to-game-mode.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | image/svg+xml -------------------------------------------------------------------------------- /assets/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml 830 | --------------------------------------------------------------------------------