switching from cachy to bazzite kernel

This commit is contained in:
tumillanino
2026-04-09 16:33:56 +10:00
parent 3f52e6286f
commit 57fdc02539
157 changed files with 6309 additions and 7 deletions

View File

@@ -0,0 +1 @@
* @xynydev @fiftydinar

View File

@@ -0,0 +1,6 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"

View File

@@ -0,0 +1,58 @@
name: Build solarpowered-ex
on:
schedule:
- cron: "30 2 * * 1,5" # build at 2:30 AM UTC every Monday & Friday
push:
paths:
- ".github/workflows/build-solarpowered-ex.yml"
- "recipes/images/solarpowered-ex.yml"
- "recipes/packages/solarpowered-ex.yml"
pull_request:
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
cancel-in-progress: true
jobs:
bluebuild:
name: Build
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
id-token: write
strategy:
fail-fast: false
matrix:
recipe:
- images/solarpowered-ex.yml
steps:
- name: Optimize build times
shell: bash
run: |
echo 'set man-db/auto-update false' | sudo debconf-communicate
sudo dpkg-reconfigure man-db
sudo rm -f /var/lib/man-db/auto-update
sudo sed -i 's/^update_initramfs=.*/update_initramfs=no/' /etc/initramfs-tools/update-initramfs.conf
- name: Build solarpowered-ex
uses: blue-build/github-action@v1.11
with:
recipe: ${{ matrix.recipe }}
build_chunked_oci: true
cosign_private_key: ${{ secrets.SIGNING_SECRET }}
registry_token: ${{ github.token }}
pr_event_number: ${{ github.event.number }}
maximize_build_space: true
retry_push_count: 3
build_opts: --rechunk-clear-plan
# generate_release:
# name: Generate Release
# permissions:
# contents: write
# needs: [bluebuild]
# if: github.event_name != 'pull_request'
# secrets: inherit
# uses: ./.github/workflows/release.yml

View File

@@ -0,0 +1,58 @@
name: Build solarpowered
on:
schedule:
- cron: "00 2 * * 1,5"
push:
paths:
- ".github/workflows/build-solarpowered.yml"
- "recipes/images/solarpowered.yml"
- "recipes/packages/solarpowered.yml"
pull_request:
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
cancel-in-progress: true
jobs:
bluebuild:
name: Build
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
id-token: write
strategy:
fail-fast: false
matrix:
recipe:
- images/solarpowered.yml
steps:
- name: Optimize build times
shell: bash
run: |
echo 'set man-db/auto-update false' | sudo debconf-communicate
sudo dpkg-reconfigure man-db
sudo rm -f /var/lib/man-db/auto-update
sudo sed -i 's/^update_initramfs=.*/update_initramfs=no/' /etc/initramfs-tools/update-initramfs.conf
- name: Build solarpowered
uses: blue-build/github-action@v1.11
with:
recipe: ${{ matrix.recipe }}
build_chunked_oci: true
cosign_private_key: ${{ secrets.SIGNING_SECRET }}
registry_token: ${{ github.token }}
pr_event_number: ${{ github.event.number }}
maximize_build_space: true
retry_push_count: 3
build_opts: --rechunk-clear-plan
# generate_release:
# name: Generate Release
# permissions:
# contents: write
# needs: [bluebuild]
# if: github.event_name != 'pull_request'
# secrets: inherit
# uses: ./.github/workflows/release.yml

View File

@@ -0,0 +1,23 @@
name: Clean up images
on:
schedule:
- cron: "00 0 * * 0"
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
jobs:
delete-older-than-30:
runs-on: ubuntu-latest
permissions:
packages: write
steps:
- name: Clean up images more than 30 days
uses: dataaxiom/ghcr-cleanup-action@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
packages: solarpowered,solarpowered-ex
older-than: 30 days
delete-untagged: true
# dry-run: true

View File

@@ -0,0 +1,49 @@
on:
workflow_call:
workflow_dispatch:
inputs:
handwritten:
description: 'Small changelog about changes in this build:'
target:
description: 'Release branch (e.g., testing). Defaults to branch name.'
permissions:
contents: write
name: Generate Release
jobs:
generate-release:
runs-on: ubuntu-latest
steps:
- name: Checkout last 500 commits (for <commits> to work)
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
with:
fetch-depth: 500
- name: Get target
id: get-target
run: |
TARGET="${{ github.event.inputs.target || github.ref }}"
TARGET="${TARGET##*/}"
if [ "$TARGET" = "main" ]; then
TARGET="latest"
fi
echo "target=$TARGET" >> $GITHUB_OUTPUT
- name: Generate Release Text
id: generate-release
run: |
python3 ./.github/workflows/changelog.py \
"${{ steps.get-target.outputs.target }}" \
./output.env ./changelog.md --workdir . --handwritten "${{ github.event.inputs.handwritten }}"
source ./output.env
echo "title=${TITLE}" >> $GITHUB_OUTPUT
echo "tag=${TAG}" >> $GITHUB_OUTPUT
- name: Create Release
uses: softprops/action-gh-release@153bb8e04406b158c6c84fc1615b65b24149a1fe # v2
with:
name: ${{ steps.generate-release.outputs.title }}
tag_name: ${{ steps.generate-release.outputs.tag }}
body_path: ./changelog.md
make_latest: ${{ steps.get-target.outputs.target == 'stable' }}
prerelease: ${{ steps.get-target.outputs.target != 'stable' }}

16
docs/solarpowered-main/.gitignore vendored Normal file
View File

@@ -0,0 +1,16 @@
cosign.key
cosign.private
/Containerfile
/Containerfile-tmp
/tmp.yml
recipes/tmp.yml
recipes/recipe-tmp.yml
*tmp.*
.bluebuild-scripts_*
/.bluebuild-scripts_*
qcow2
manifest*
config.toml
Containerfile*
./containerfile
*.img

View File

@@ -0,0 +1,92 @@
@default:
just --list
set shell := ["bash", "-c"]
RCPDIR := "./recipes/images"
CTFS := "./containerfiles"
VERSION := "localbuild"
USRN := "local"
PSWD := "local"
# Build image-name as named in ./recipes/images
build *ARGS:
#!/usr/bin/env bash
if [[ -e Containerfile."{{ ARGS }}" ]]; then
rm Containerfile."{{ ARGS }}"
fi
bluebuild generate -o Containerfile."{{ ARGS }}" "{{ RCPDIR }}"/"{{ ARGS }}".yml --skip-validation
podman build -t "{{ ARGS }}":"{{ VERSION }}" --file Containerfile."{{ ARGS }}" --squash . 2>&1 | tee "{{ RCPDIR }}"/"{{ ARGS }}".log
rm Containerfile."{{ ARGS }}"
rm -rf ./.bluebuild-*
# Build a Containerfile stored within ./containerfiles/argument/ with logs
ctf *ARGS:
podman build -f "{{ CTFS }}"/"{{ ARGS }}"/Containerfile -t "{{ ARGS }}":{{VERSION}} . 2>&1 | tee "{{ CTFS }}"/"{{ ARGS }}"/"{{ ARGS }}".log
# Build, create, and purge archive of image-name as named in ./recipes/images. Slower, but useful for testing recipes cleanly
targz *ARGS:
bluebuild build --skip-validation -s -c zstd -a ./ "{{ RCPDIR }}"/"{{ ARGS }}".yml
rm -f ./tmp.tar.gz
rm -rf ./.bluebuild-scripts_*
# Save Podman container to a .gz file for inspection
save *ARGS:
podman save {{ ARGS }}:{{ VERSION }} | gzip > {{ ARGS }}.gz
# Build image-name as named in ./recipes/images and export a VM-ready QCOW2 file in ./qcow2
qcow2 *ARGS: config
#!/usr/bin/env bash
set -euo pipefail
if [[ ! -e {{ RCPDIR }}/{{ ARGS }}.yml ]]; then
sudo podman build -t "{{ ARGS }}":"{{ VERSION }}" --file {{ CTFS }}/{{ ARGS }}/Containerfile . 2>&1 | tee {{ CTFS }}/{{ ARGS }}/{{ ARGS }}.log
sudo chown 1000:1000 {{ CTFS }}/{{ ARGS }}/{{ ARGS }}.log
else
bluebuild generate -o Containerfile."{{ ARGS }}" "{{ RCPDIR }}"/"{{ ARGS }}".yml
sudo podman build -t "{{ ARGS }}":"{{ VERSION }}" --file Containerfile."{{ ARGS }}"
fi
sudo podman run --rm -it --privileged \
--pull=newer \
--security-opt label=type:unconfined_t \
-v /var/lib/containers/storage:/var/lib/containers/storage \
-v .:/output \
-v ./config.toml:/config.toml:ro \
quay.io/centos-bootc/bootc-image-builder:latest \
--rootfs btrfs \
--use-librepo=True \
--chown 1000:1000 \
localhost/"{{ ARGS }}":"{{ VERSION }}"
if [[ ! -e {{ RCPDIR }}/{{ ARGS }}.yml ]]; then
sudo rm -rf ./.bluebuild*
rm Containerfile."{{ ARGS }}"
fi
sudo rm ./manifest*
# Completely clean user & system-level Podman image registry & ./
scrub:
#!/usr/bin/env bash
set -uo pipefail
rm -rf ./qcow2 ./.bluebuild-scripts_*
rm -f ./tmp.tar.gz ./config.toml
podman rmi -f $(podman images -f "dangling=true" -q)
sudo rm -f manifest-qcow2.json
sudo podman rmi -f $(sudo podman images -f "dangling=true" -q)
# Generate bootc-image-builder config
config:
#!/usr/bin/env bash
if [[ ! -e ./config.toml ]]; then
echo "Generating config.toml..."
cat <<EOF >> ./config.toml
[[customizations.user]]
name = "{{ USRN }}"
password = "{{ PSWD }}"
groups = ["wheel"]
EOF
echo "config.toml generated."
else
echo "config.toml already exists."
fi
# Restore SELinux context to /var/lib/containers in case rootful Podman perms get messed up
restorecon:
sudo restorecon -R -F /var/lib/containers

View File

@@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@@ -0,0 +1,86 @@
# <center>☀️ solarpowered ☀️</center>
`solarpowered` and `solarpowered-ex` are custom images based on [Fedora Silverblue](https://quay.io/repository/fedora/fedora-silverblue?tab=tags) using [BlueBuild](https://github.com/blue-build/template). I started this project as a learning and hobby project to familiarize myself with containers, Linux, and GitHub.
Both images are fully functional for daily operations.
Also check out [atomic-t480s](https://github.com/askpng/atomic-t480s), much simpler custom image project I started to support Lenovo Thinkpad T480s users.
I named this project `solarpowered` because I like Gawain from Fate/Extra & Fate/Grand Order.
# Highlights
- Multimedia codecs from `fedora-multimedia` repo (and `intel-media-driver` from RPM Fusion)
- Distrobox, Just, and VSCodium
- Waydroid and ADB
- Nautilus addons
- More vanilla GNOME Experience
- Zen Browser instead of Firefox
- Colloid, MoreWaita, Tela, and Qogir icon themes
- Nerd Fonts Symbols and a small selection of fonts from Google Fonts
- Several sound & icon themes & fonts installed OOTB
## solarpowered - made to support Lenovo T480/s devices
Includes the following tools for maximum Lenovo T480/s functionality with 0 layering:
- `igt-gpu-tools` for monitoring iGPU use
- [python-validity](https://copr.fedorainfracloud.org/coprs/sneexy/python-validity/) (sneexy)
- [throttled](https://copr.fedorainfracloud.org/coprs/abn/throttled/) (abn)
- TLP
- `zcfan`
This image is shipped with [kernel-blu](https://copr.fedorainfracloud.org/coprs/sentry/kernel-blu/) with `v4l2loopback` kernel module
It is highly recommended to run `append solarpowered-setup` upon installation. This installs TLP-UI Flatpak, configrues necessary kernel arguments & local `initramfs` regeneration, and enables `python-validity` and `zcfan`. It is recommended to reboot afterwards.
> NOTE: This does *not* configure `throttled`, as undervolt stable values differ between machines. For further information about undervolting, refer to the official documentation on `throttled`.
## solarpowered-ex - for Ryzen/AMD computers
Includes the following tools:
- Gamescope, Lutris, MangoHud and experimental implementation of Steam Gaming Mode
- Beta/Unstable version of Sunshine for game streaming
- Ramalama and ROCM packages
- [LACT-libadwaita](https://copr.fedorainfracloud.org/coprs/ilyaz/LACT/)
This image is shipped with [kernel-cachyos-lto](https://copr.fedorainfracloud.org/coprs/bieszczaders/kernel-cachyos/) with its built-in `v4l2loopback`, `evdi` and `displaylink`, as well as `zenergy` for Ryzen power stats reading.
# Installation
You can install by rebasing from Silverblue or generating an ISO file yourself. If you decide to give this a go, and would like to provide feedback and/or suggestions, feel free to open a new issue.
## Rebase
To rebase from a Silverblue installation, follow the steps below.
### solarpowered
1. Rebase to the unsigned image to get the proper signing keys + policies installed and reboot automatically:
```
rpm-ostree rebase ostree-unverified-registry:ghcr.io/askpng/solarpowered:latest --reboot
```
2. Rebase to the signed image and reboot automatically:
```
rpm-ostree rebase ostree-image-signed:docker://ghcr.io/askpng/solarpowered:latest --reboot
```
### solarpowered-ex
1. Rebase to the unsigned image to get the proper signing keys + policies installed and reboot automatically:
```
rpm-ostree rebase ostree-unverified-registry:ghcr.io/askpng/solarpowered-ex:latest --reboot
```
2. Rebase to the signed image and reboot automatically:
```
rpm-ostree rebase ostree-image-signed:docker://ghcr.io/askpng/solarpowered-ex:latest --reboot
```
## Verification
These images are signed with [Sigstore](https://www.sigstore.dev/)'s [cosign](https://github.com/sigstore/cosign).
### Verify `cosign.pub`
Download the `cosign.pub` file from this repo and run the following command within the same directory:
```bash
cosign verify --key cosign.pub ghcr.io/askpng/solarpowered
```

View File

@@ -0,0 +1,43 @@
name: Build autosolarpowered
on:
schedule:
- cron: "00 18 * * 1,5" # build at 17:30 every Monday & Friday
push: # build on push
paths: # build on push of the following files
- "recipes/images/autosolarpowered.yml" # solarpowered recipe
- "recipes/images/autosolarpowered-ex.yml" # solarpowered-ex recipe
pull_request: # allow PRs triggering builds
workflow_dispatch: # allow manually triggering builds
concurrency:
# only run one build at a time
group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
cancel-in-progress: true
jobs:
bluebuild:
name: Build
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
id-token: write
strategy:
fail-fast: false # stop GH from cancelling all matrix builds if one fails
matrix:
recipe:
- images/autosolarpowered.yml
- images/autosolarpowered-ex.yml
steps:
# the build is fully handled by the reusable github action
- name: Build Custom Image
uses: blue-build/github-action@v1.8
with:
recipe: ${{ matrix.recipe }}
rechunk: true
cosign_private_key: ${{ secrets.SIGNING_SECRET }}
registry_token: ${{ github.token }}
pr_event_number: ${{ github.event.number }}
# enabled by default, disable if your image is small and you want faster builds
maximize_build_space: true

View File

@@ -0,0 +1,37 @@
name: Build bootc images
on:
schedule:
- cron: "00 18 * * 4" # build at 18:00 UTC every Thursday
push:
paths:
- "recipes/base/base-bootc.yml" # base of bootc images
- "recipes/solarpowered-bootc.yml" # solarpowered-bootc recipe
- "recipes/solarpowered-ex-bootc.yml" # solarpowered-bootc recipe
pull_request: # allow PRs triggering builds
workflow_dispatch: # allow manually triggering builds
jobs:
bluebuild:
name: Build
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
id-token: write
strategy:
fail-fast: false # stop GH from cancelling all matrix builds if one fails
matrix:
recipe:
- solarpowered-bootc.yml
- solarpowered-ex-bootc.yml
steps:
# the build is fully handled by the reusable github action
- name: Build Custom Image
uses: blue-build/github-action@v1.8
with:
recipe: ${{ matrix.recipe }}
rechunk: true
cosign_private_key: ${{ secrets.SIGNING_SECRET }}
registry_token: ${{ github.token }}
pr_event_number: ${{ github.event.number }}

View File

@@ -0,0 +1,34 @@
name: Build solarpowered-raw
on:
schedule:
- cron: "00 17 * * 1,3,5" # build at 17:00 UTC every Monday, Wednesday & Friday
push:
paths: # trigger build only if solarpowered-ex.yml is updated
- "recipes/solarpowered-raw.yml"
pull_request: # allow PRs triggering builds
workflow_dispatch: # allow manually triggering builds
jobs:
bluebuild:
name: Build
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
id-token: write
strategy:
fail-fast: false # stop GH from cancelling all matrix builds if one fails
matrix:
recipe:
- solarpowered-raw.yml
steps:
# the build is fully handled by the reusable github action
- name: Build Custom Image
uses: blue-build/github-action@v1.8
with:
recipe: ${{ matrix.recipe }}
rechunk: true
cosign_private_key: ${{ secrets.SIGNING_SECRET }}
registry_token: ${{ github.token }}
pr_event_number: ${{ github.event.number }}

View File

@@ -0,0 +1,43 @@
name: Build solarizzed
on:
schedule:
- cron: "00 6 * * 1,5" # build at 6 AM UTC every Monday & Friday
push: # build on push
paths: # build on push of the following files
# - "recipes/images/solarizzed.yml" # solarizzed recipe
- "recipes/images/solarizzed-gnome.yml" # solarizzed recipe
pull_request: # allow PRs triggering builds
workflow_dispatch: # allow manually triggering builds
concurrency:
# only run one build at a time
group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
cancel-in-progress: true
jobs:
bluebuild:
name: Build
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
id-token: write
strategy:
fail-fast: false # stop GH from cancelling all matrix builds if one fails
matrix:
recipe:
# - images/solarizzed.yml
- images/solarizzed-gnome.yml
steps:
# the build is fully handled by the reusable github action
- name: Build Custom Image
uses: blue-build/github-action@v1.9
with:
recipe: ${{ matrix.recipe }}
rechunk: true
cosign_private_key: ${{ secrets.SIGNING_SECRET }}
registry_token: ${{ github.token }}
pr_event_number: ${{ github.event.number }}
# enabled by default, disable if your image is small and you want faster builds
maximize_build_space: true

View File

@@ -0,0 +1,43 @@
name: Build solarpowered-rawhide
on:
# schedule:
# - cron: "00 18 * * 1,5" # build at 17:30 every Monday & Friday
push: # build on push
paths: # build on push of the following files
- "recipes/images/solarpowered-rawhide.yml" # solarpowered recipe
- "recipes/images/solarpowered-ex-rawhide.yml" # solarpowered-ex recipe
pull_request: # allow PRs triggering builds
workflow_dispatch: # allow manually triggering builds
concurrency:
# only run one build at a time
group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
cancel-in-progress: true
jobs:
bluebuild:
name: Build
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
id-token: write
strategy:
fail-fast: false # stop GH from cancelling all matrix builds if one fails
matrix:
recipe:
- images/solarpowered-rawhide.yml
- images/solarpowered-ex-rawhide.yml
steps:
# the build is fully handled by the reusable github action
- name: Build Custom Image
uses: blue-build/github-action@v1.8
with:
recipe: ${{ matrix.recipe }}
rechunk: true
cosign_private_key: ${{ secrets.SIGNING_SECRET }}
registry_token: ${{ github.token }}
pr_event_number: ${{ github.event.number }}
# enabled by default, disable if your image is small and you want faster builds
maximize_build_space: true

View File

@@ -0,0 +1,3 @@
# archives
This folder is for placing archived recipes/files. For reference only.

View File

@@ -0,0 +1,25 @@
#!/usr/bin/env bash
set -ouex pipefail
OS_VERSION=$(rpm -E %fedora)
VER=$(basename $(curl -Ls -o /dev/null -w %{url_effective} https://github.com/bazzite-org/kernel-bazzite/releases/latest))
dnf -y remove kernel-* && rm -drf /usr/lib/modules/*
echo 'Installing Bazzite kernel...'
dnf install -y \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-common-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-core-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-devel-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-devel-matched-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-modules-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-modules-akmods-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-modules-core-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-modules-extra-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-modules-extra-matched-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-modules-internal-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-tools-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-tools-libs-$VER.fc$OS_VERSION.x86_64.rpm

View File

@@ -0,0 +1,9 @@
#!/usr/bin/env bash
set -euo pipefail
# find latest version of cosign
LATEST_VERSION=$(curl https://api.github.com/repos/sigstore/cosign/releases/latest | grep tag_name | cut -d : -f2 | tr -d "v\", ")
# download & install cosign
rpm-ostree install https://github.com/sigstore/cosign/releases/latest/download/cosign-${LATEST_VERSION}-1.x86_64.rpm

View File

@@ -0,0 +1,9 @@
#!/usr/bin/env bash
set -euo pipefail
sudo sed -i 's/enabled=1/enabled=0/' \
/etc/yum.repos.d/_copr:copr.fedorainfracloud.org:phracek:PyCharm.repo \
/etc/yum.repos.d/google-chrome.repo \
/etc/yum.repos.d/rpmfusion-nonfree-nvidia-driver.repo \
/etc/yum.repos.d/rpmfusion-nonfree-steam.repo

View File

@@ -0,0 +1,20 @@
#!/usr/bin/env bash
set -euo pipefail
# Replace multimedia packages with ones from negativo17-multimedia-repo
echo 'Replacing multimedia packages to packages from negativo17-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
rpm-ostree override replace --from repo='fedora' --experimental --remove=OpenCL-ICD-Loader ocl-icd || true

View File

@@ -0,0 +1,5 @@
#!/usr/bin/env bash
set -euo pipefail
wget https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/gambling-porn/hosts -O /usr/etc/hosts

View File

@@ -0,0 +1,45 @@
#!/usr/bin/env bash
set -oue pipefail
GITHUB_URL="https://github.com/bikass/kora"
if [ -z "$GITHUB_URL" ]; then
echo "Error: GITHUB_URL is not set."
exit 1
fi
REPO_NAME=$(basename "$GITHUB_URL" .git)
CLONE_DIR="/tmp/clone/$REPO_NAME"
echo "Preparing directory for cloning..."
mkdir -p "$CLONE_DIR"
cd "$CLONE_DIR"
echo "Directory created."
git clone "$GITHUB_URL"
echo "Repo cloned. Copying files..."
if [ -d "./$REPO_NAME/kora" ]; then
echo "Installing kora icon set..."
cp -r "./$REPO_NAME/kora" /usr/share/icons/
fi
if [ -d "./$REPO_NAME/kora-light" ]; then
echo "Installing kora-light icon set..."
cp -r "./$REPO_NAME/kora-light" /usr/share/icons/
fi
if [ -d "./$REPO_NAME/kora-light-panel" ]; then
echo "Installing kora-light-panel icon set..."
cp -r "./$REPO_NAME/kora-light-panel" /usr/share/icons/
fi
if [ -d "./$REPO_NAME/kora-pgrey" ]; then
echo "Installing kora-pgrey icon set..."
cp -r "./$REPO_NAME/kora-pgrey" /usr/share/icons/
fi
echo "Folders copied. Cleaning up!"
rm -drf "$CLONE_DIR"
echo "Cloned repo deleted."
echo "Script finished. Theme installation complete."

View File

@@ -0,0 +1,9 @@
#!/usr/bin/env bash
set -euo pipefail
# find latest version of luminance
LATEST_VERSION=$(curl https://api.github.com/repos/sidevesh/Luminance/releases/latest | grep tag_name | cut -d : -f2 | tr -d "v\", ")
# download & install latest version of luminance
rpm-ostree install https://github.com/sidevesh/Luminance/releases/latest/download/luminance-${LATEST_VERSION}.rpm

View File

@@ -0,0 +1,12 @@
#!/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
# Download udev rules file
wget https://openrgb.org/releases/release_0.9/60-openrgb.rules
# Move udev rules file to udev rules directory
mv 60-openrgb.rules /usr/lib/udev/rules.d

View File

@@ -0,0 +1,9 @@
#!/usr/bin/env bash
set -euo pipefail
# find latest version of windscribe stable RPM
LATEST_VERSION=$(curl https://api.github.com/repos/Windscribe/Desktop-App/releases/latest | grep tag_name | cut -d : -f2 | tr -d "v\", ")
# download & install latest version of windscribe stable RPM
rpm-ostree install https://github.com/Windscribe/Desktop-App/releases/latest/download/windscribe_${LATEST_VERSION}_x86_64_fedora.rpm

View File

@@ -0,0 +1,18 @@
#!/usr/bin/env bash
set -oue pipefail
echo 'Preparing directory for cloning...'
mkdir -p /tmp/clone/ChromeOS-kde
cd /tmp/clone/ChromeOS-kde
echo 'Directory created.'
git clone https://github.com/vinceliuice/ChromeOS-kde.git
echo 'Repo cloned. Running install script...'
ChromeOS-kde/install.sh
echo 'Install script finished. Removing cloned repo...'
rm -r ChromeOS-kde/
echo 'Cloned repo deleted.'

View File

@@ -0,0 +1,27 @@
#!/usr/bin/env bash
set -euo pipefail
GIT=https://github.com/pkgforge-dev/Citron-AppImage
APPDIR=/usr/libexec/appimages
GITOWNER=$(echo "$GIT" | sed -E 's#https://github.com/([^/]+)/([^/]+)(\.git)*#\1#')
GITREPO=$(echo "$GIT" | sed -E 's#https://github.com/([^/]+)/([^/]+)(\.git)*#\2#')
APPNAME=citron
echo 'Downloading latest version of $APPNAME from $GITOWNER/$GITREPO'.
URL="https://github.com/$GITOWNER/$GITREPO/releases/download/v$(curl https://api.github.com/repos/$GITOWNER/$GITREPO/releases/latest | grep tag_name | cut -d : -f2 | tr -d "v\", ")/Citron-v$(curl https://api.github.com/repos/$GITOWNER/$GITREPO/releases/latest | grep tag_name | cut -d : -f2 | tr -d "v\", ")-anylinux-x86_64_v3.AppImage"
echo "Downloading $URL as $APPDIR/$APPNAME.AppImage"
mkdir -p $APPDIR
curl -L "$URL" -o "$APPDIR/$APPNAME.AppImage"
echo "Download finished! Making $APPNAME executable..."
chmod +x $APPDIR/$APPNAME.AppImage
echo "Creating symlink to /usr/bin/$APPNAME..."
ln -sf $APPDIR/$APPNAME.AppImage /usr/bin/$APPNAME
echo "/usr/bin/$APPNAME symlink created!"

View File

@@ -0,0 +1,18 @@
#!/usr/bin/env bash
set -oue pipefail
echo 'Preparing directory for cloning...'
mkdir -p /tmp/clone
cd /tmp/clone/
echo 'Directory created.'
git clone https://github.com/vinceliuice/Layan-kde.git
echo 'Repo cloned. Running install script...'
Layan-kde/install.sh
echo 'Install script finished. Removing cloned repo...'
rm -r Layan-kde
echo 'Cloned repo deleted.'

View File

@@ -0,0 +1,25 @@
#!/usr/bin/env bash
set -oue pipefail
echo 'Preparing directory for cloning...'
mkdir -p /tmp/clone/
cd /tmp/clone/
echo 'Directory created.'
git clone https://github.com/Notify-ctrl/Plasma-Overdose.git
echo 'Repo cloned. Copying files...'
# theme
cp -r ./Plasma-Overdose/aurorae/ /usr/share/aurorae/themes
# cursors
cp -r ./Plasma-Overdose/cursors /usr/share/icons/CursorsOverdose/
# colorscheme
cp -r ./Plasma-Overdose/colorschemes/* /usr/share/color-schemes/
# global theme
cp -r ./Plasma-Overdose/plasma /usr/share/
echo 'Folders copied. Cleaning up!'
rm -drf Plasma-Overdose/
echo 'Cloned repo deleted.'

View File

@@ -0,0 +1,27 @@
#!/usr/bin/env bash
set -euo pipefail
GIT=https://github.com/Ryubing/Ryujinx
APPDIR=/usr/libexec/appimages
GITOWNER=$(echo "$GIT" | sed -E 's#https://github.com/([^/]+)/([^/]+)(\.git)*#\1#')
GITREPO=$(echo "$GIT" | sed -E 's#https://github.com/([^/]+)/([^/]+)(\.git)*#\2#')
APPNAME=$GITREPO
echo 'Downloading latest version of $APPNAME from $GITOWNER/$GITREPO'.
URL="https://github.com/$GITOWNER/$GITREPO/releases/download/$(curl https://api.github.com/repos/$GITOWNER/$GITREPO/releases/latest | grep tag_name | cut -d : -f2 | tr -d "v\", ")/ryujinx-$(curl https://api.github.com/repos/$GITOWNER/$GITREPO/releases/latest | grep tag_name | cut -d : -f2 | tr -d "v\", ")-x64.AppImage"
echo "Downloading $URL as $APPDIR/$APPNAME.AppImage"
mkdir -p $APPDIR
curl -L "$URL" -o "$APPDIR/$APPNAME.AppImage"
echo "Download finished! Making $APPNAME executable..."
chmod +x $APPDIR/$APPNAME.AppImage
echo "Creating symlink to /usr/bin/$APPNAME..."
ln -sf $APPDIR/$APPNAME.AppImage /usr/bin/$APPNAME
echo "/usr/bin/$APPNAME symlink created!"

View File

@@ -0,0 +1,28 @@
#!/usr/bin/env bash
set -euo pipefail
GIT=https://github.com/SteamGridDB/steam-rom-manager
APPDIR=/usr/libexec/appimages
GITOWNER=$(echo "$GIT" | sed -E 's#https://github.com/([^/]+)/([^/]+)(\.git)*#\1#')
GITREPO=$(echo "$GIT" | sed -E 's#https://github.com/([^/]+)/([^/]+)(\.git)*#\2#')
# APPNAME=$GITREPO
APPNAME=Steam-ROM-Manager # Manually entered because their release name != git repo name
echo 'Downloading latest version of $APPNAME from $GITOWNER/$GITREPO'.
URL="https://github.com/$GITOWNER/$GITREPO/releases/download/v$(curl https://api.github.com/repos/$GITOWNER/$GITREPO/releases/latest | grep tag_name | cut -d : -f2 | tr -d "v\", ")/$APPNAME-$(curl https://api.github.com/repos/$GITOWNER/$GITREPO/releases/latest | grep tag_name | cut -d : -f2 | tr -d "v\", ").AppImage"
echo "Downloading $URL as $APPDIR/$APPNAME.AppImage"
mkdir -p $APPDIR
curl -L "$URL" -o "$APPDIR/$APPNAME.AppImage"
echo "Download finished! Making $APPNAME executable..."
chmod +x $APPDIR/$APPNAME.AppImage
echo "Creating symlink to /usr/bin/$APPNAME..."
ln -sf $APPDIR/$APPNAME.AppImage /usr/bin/$APPNAME
echo "/usr/bin/$APPNAME symlink created!"

View File

@@ -0,0 +1,65 @@
---
# yaml-language-server: $schema=https://schema.blue-build.org/recipe-v1.json
# enter image name here
name: solarpowered-ex
# enter image description here
description: Custom image optimized for AMD PCs on top of Silverblue
# defines base image // not to be changed
base-image: ghcr.io/ublue-os/silverblue-main
# base image is locked to latest // not to be changed
image-version: 41
modules:
# contains repo files for codium, configs and services that will be shared across images
- from-file: shared/files.yml
# kernel selection. select ONE of the following from-file line
# or uncomment all three to opt to use stock fedora kernel
# - from-file: kernels/blu.yml
- from-file: kernels/cachy.yml
# - from-file: kernels/tkg.yml
# removes firefox, unused fonts, undesired gnome packages & other utilities
- from-file: packages/core-discard.yml
# installs necessities such as GUI apps, CLI apps, themes, & replaces mutter packages with patched version
- from-file: packages/core.yml
# image-specific packages module
# systemd services related to image-specific packages
# may also be placed within this module for simplicity.
- from-file: packages/solarpowered-ex.yml
# disables all repos except for fedora and fedora-updates
- from-file: shared/disable-repos.yml
# installs icons packs & nautilus extensions
- from-file: shared/script.yml
# installs shared fonts
- from-file: shared/fonts.yml
# contains gnome extensions that will be shared across all images
# does not contain several other extensions that must be installed locally
- from-file: shared/gnome-extensions.yml
# configures gschema for extensions, desktop, touchpad, and WM prefs
# - from-file: shared/gschema-overrides.yml
# disables NetworkManager-online-service, flatpak update services,
# and enables topgrade updater
- from-file: shared/systemd.yml
# image-specific files module
# copies files into /
- type: files
files:
# create a folder under files/ with the image name
# and place directories and files appropriately.
# source entry should be the same name as the image name.
- source: solarpowered-ex # image name, or folder as named under files/
destination: /
- type: signing

View File

@@ -0,0 +1,65 @@
---
# yaml-language-server: $schema=https://schema.blue-build.org/recipe-v1.json
# enter image name here
name: solarpowered
# enter image description here
description: Custom image optimized for AMD PCs on top of Silverblue
# defines base image // not to be changed
base-image: ghcr.io/ublue-os/silverblue-main
# base image is locked to latest // not to be changed
image-version: 41
modules:
# contains repo files for codium, configs and services that will be shared across images
- from-file: shared/files.yml
# kernel selection. select ONE of the following from-file line
# or uncomment all three to opt to use stock fedora kernel
- from-file: kernels/blu.yml
# - from-file: kernels/cachy.yml
# - from-file: kernels/tkg.yml
# removes firefox, unused fonts, undesired gnome packages & other utilities
- from-file: packages/core-discard.yml
# installs necessities such as GUI apps, CLI apps, themes, & replaces mutter packages with patched version
- from-file: packages/core.yml
# image-specific packages module
# systemd services related to image-specific packages
# may also be placed within this module for simplicity.
- from-file: packages/solarpowered.yml
# disables all repos except for fedora and fedora-updates
- from-file: shared/disable-repos.yml
# installs icons packs & nautilus extensions
- from-file: shared/script.yml
# installs shared fonts
- from-file: shared/fonts.yml
# contains gnome extensions that will be shared across all images
# does not contain several other extensions that must be installed locally
- from-file: shared/gnome-extensions.yml
# configures gschema for extensions, desktop, touchpad, and WM prefs
# - from-file: shared/gschema-overrides.yml
# disables NetworkManager-online-service, flatpak update services,
# and enables topgrade updater
- from-file: shared/systemd.yml
# image-specific files module
# copies files into /
- type: files
files:
# create a folder under files/ with the image name
# and place directories and files appropriately.
# source entry should be the same name as the image name.
- source: solarpowered # image name, or folder as named under files/
destination: /
- type: signing

View File

@@ -0,0 +1,81 @@
---
# yaml-language-server: $schema=https://schema.blue-build.org/recipe-v1.json
name: solarizzed-gnome
description: Based on bazzite-deck-gnome
base-image: ghcr.io/ublue-os/bazzite-deck-gnome
image-version: stable
modules:
- type: files
files:
- source: shared/usr
destination: /usr
- type: dnf
repos:
cleanup: true
files:
- https://raw.githubusercontent.com/terrapkg/subatomic-repos/main/terra.repo
copr:
- tigro/better_fonts
- dusansimic/themes
- sneexy/zen-browser
- ilyaz/LACT
optfix:
- zen
install:
install-weak-deps: false
packages:
# codium
- codium
# prettifying packages
- deepin-sound-theme
- fontconfig-font-replacements
- go-task
- morewaita-icon-theme
- nautilus-extensions
- nautilus-python
- oxygen-sounds
- pop-sound-theme
- rclone
- rclone-browser
- yaru-sound-theme
# misc
- lact
- python3-pyclip
- zen-browser
remove:
packages:
- gnome-tweaks
- type: systemd
system:
enabled:
- lactd.service
- type: default-flatpaks
configurations:
- notify: false
scope: system
install:
- page.tesk.Refine
# extensions
- type: gnome-extensions
install:
- Alphabetical App Grid
- 5425 # Battery time
- Bluetooth Battery Meter
- Night Theme Switcher
- 841 # Freon
- Quick Settings Tweaks
# installs themes & icons
- from-file: shared/script.yml
# installs luminance & windscribe
- from-file: shared/rpms.yml
# installs shared fonts
- from-file: shared/fonts.yml
- type: signing

View File

@@ -0,0 +1,64 @@
---
# yaml-language-server: $schema=https://schema.blue-build.org/recipe-v1.json
name: solarizzed
description: Based on bazzite-deck
base-image: ghcr.io/ublue-os/bazzite-deck
image-version: stable
modules:
# contains repo files for codium
- type: files
files:
- source: shared/etc/yum.repos.d
destination: /etc/yum.repos.d
- source: shared/usr
destination: /usr
- type: rpm-ostree
repos:
# better-fonts repo for fontconfig-font-replacements
- https://copr.fedorainfracloud.org/coprs/hyperreal/better_fonts/repo/fedora-%OS_VERSION%/hyperreal-better_fonts-fedora-%OS_VERSION%.repo
# Koi
- https://copr.fedorainfracloud.org/coprs/birkch/Koi/repo/fedora-%OS_VERSION%/birkch-Koi-fedora-%OS_VERSION%.repo
# zen browser
- https://copr.fedorainfracloud.org/coprs/sneexy/zen-browser/repo/fedora-%OS_VERSION%/sneexy-zen-browser-fedora-%OS_VERSION%.repo
optfix:
- windscribe
- zen
install:
# codium
- codium
# prettifying packages
- adw-gtk3-theme
- deepin-sound-theme
- fontconfig-font-replacements
- Koi
- kvantum
- oxygen-sounds
- pop-sound-theme
- rclone
- rclone-browser
- yaru-sound-theme
# misc
- python3-pyclip
- zen-browser
# installs themes & icons
- type: script
scripts:
- solarizzed/chromeos.sh
- solarizzed/layan.sh
- shared/tela-icon-theme.sh
- shared/qogir-icon-theme.sh
- shared/kora-icon-theme.sh
# citron appimage + /usr/bin link
- solarizzed/citron.sh
snippets:
# auto-fetch & install latest version of windscribe
- 'rpm-ostree install https://github.com/Windscribe/Desktop-App/releases/latest/download/windscribe_$(curl https://api.github.com/repos/Windscribe/Desktop-App/releases/latest | grep tag_name | cut -d : -f2 | tr -d "v\", ")_x86_64_fedora.rpm'
# installs shared fonts
- from-file: shared/fonts.yml
- type: signing

View File

@@ -0,0 +1,27 @@
name: solarpowered-bootc
description: Lenovo T480s image based on Fedora's bootc image.
base-image: quay.io/fedora/fedora-bootc
image-version: 41
modules:
- from-file: shared/files.yml
- from-file: base/base-bootc.yml
- from-file: kernels/blu.yml
- from-file: shared/fonts.yml
- from-file: shared/gnome-extensions.yml
- from-file: shared/script.yml
- from-file: shared/systemd.yml
- type: files
files:
- source: solarpowered
destination: /
- type: signing

View File

@@ -0,0 +1,29 @@
name: solarpowered-ex-bootc
description: Image optimized for AMD PC, based on Fedora's bootc image.
base-image: quay.io/fedora/fedora-bootc
image-version: 41
modules:
- from-file: shared/files.yml
- from-file: base/base-bootc.yml
- from-file: kernels/tkg.yml
- from-file: packages/packages-ex.yml
- from-file: shared/fonts.yml
- from-file: shared/gnome-extensions.yml
- from-file: shared/script.yml
- from-file: shared/systemd.yml
- type: files
files:
- source: solarpowered-ex
destination: /
- type: signing

View File

@@ -0,0 +1,240 @@
---
# yaml-language-server: $schema=https://schema.blue-build.org/recipe-v1.json
# enter image name here
name: autosolarpowered-ex-rawhide
# enter image description here
description: Custom image for AMD machines, based on Vanilla Silverblue
# defines base image
# ---
base-image: quay.io/fedora-ostree-desktops/silverblue
# defines image major version
# ---
image-version: rawhide
modules:
- type: files
files:
- source: shared
destination: /
- type: bling
install:
# rpmfusion instead of negativo17 for rawhide
- rpmfusion
- type: script
scripts:
- shared/nautilus-copy-path.sh
- shared/tela-icon-theme.sh
- shared/qogir-icon-theme.sh
- type: rpm-ostree
repos:
- https://copr.fedorainfracloud.org/coprs/zhangyuannie/butter/repo/fedora-rawhide/zhangyuannie-butter-fedora-rawhide.repo
- https://copr.fedorainfracloud.org/coprs/tigro/better_fonts/repo/fedora-rawhide/tigro-better_fonts-fedora-rawhide.repo
- https://copr.fedorainfracloud.org/coprs/dusansimic/themes/repo/fedora-rawhide/dusansimic-themes-fedora-rawhide.repo
- https://copr.fedorainfracloud.org/coprs/shdwchn10/AllTheTools/repo/fedora-rawhide/shdwchn10-AllTheTools-fedora-rawhide.repo
- https://copr.fedorainfracloud.org/coprs/sneexy/zen-browser/repo/fedora-rawhide/sneexy-zen-browser-fedora-rawhide.repo
optfix:
- zen
install:
- alsa-firmware
- ffmpeg
- ffmpeg-libs
- ffmpegthumbnailer
- fontconfig-font-replacements
- gnome-epub-thumbnailer
- heif-pixbuf-loader
- intel-media-driver
- libcamera
- libcamera-gstreamer
- libcamera-ipa
- libcamera-tools
- libva-utils
- pipewire-plugin-libcamera
- pipewire-plugin-vulkan
- pulseaudio-utils
- uxplay
- vulkan-headers
- apr
- apr-util
- bootc
- distrobox
- fastfetch
- fish
- fzf
- ifuse
- inxi
- just
- kernel-tools
- lm_sensors
- lzip
- net-tools
- nvme-cli
- nvtop
- openssl
- smartmontools
- squashfs-tools
- starship
- symlinks
- tcpdump
- topgrade
- traceroute
- wireguard-tools
- wl-clipboard
- zstd
- baobab
- butter
- codium
- firewall-config
- gnome-boxes
- gnome-tweaks
- nautilus-extensions
- nautilus-python
- ptyxis
- zen-browser
- flatpak-spawn
- fuse
- grub2-tools-extra
- hunspell
- hunspell-en
- ibus-mozc
- input-remapper
- libappindicator
- libratbag-ratbagd
- ocl-icd
- openrgb-udev-rules
- steam-devices
- xorg-x11-server-Xwayland
- adw-gtk3-theme
- fonts-tweak-tool
- morewaita-icon-theme
- deepin-sound-theme
- oxygen-sounds
- pop-sound-theme
- yaru-sound-theme
- android-tools
- python3-pyclip
- waydroid
# nonfree-codecs
- ffmpeg
- gstreamer1-plugin-libav
- gstreamer1-plugins-bad-free-extras
- gstreamer1-plugins-bad-freeworld
- gstreamer1-plugins-ugly
- gstreamer1-vaapi
- mesa-va-drivers-freeworld
remove:
- fedora-bookmarks
- fedora-chromium-config
- fedora-chromium-config-gnome
- fedora-flathub-remote
- fedora-repos-archive
- fedora-repos-ostree
- fedora-third-party
- fedora-workstation-repositories
- fedora-workstation-backgrounds
- gnome-classic-session
- gnome-shell-extension-apps-menu
- gnome-shell-extension-background-logo
- gnome-shell-extension-launch-new-instance
- gnome-shell-extension-places-menu
- gnome-shell-extension-window-list
- gnome-software
- gnome-software-rpm-ostree
- gnome-system-monitor
- gnome-tour
- totem-video-thumbnailer
- default-fonts-cjk-sans
- firefox
- firefox-langpacks
- OpenCL-ICD-Loader
- rygel
- yelp
# free codecs
- fdk-aac-free
- ffmpeg-free
- libavcodec-free
- libavdevice-free
- libavfilter-free
- libavformat-free
- libavutil-free
- libpostproc-free
- libswresample-free
- libswscale-free
- mesa-va-drivers
replace:
- from-repo: https://copr.fedorainfracloud.org/coprs/trixieua/mutter-patched/repo/fedora-rawhide/trixieua-mutter-patched-fedora-rawhide.repo
packages:
- gnome-shell
- mutter
- mutter-common
- xorg-x11-server-Xwayland
- type: rpm-ostree
optfix:
- windscribe
# installs luminance & windscribe directly from github releases
- from-file: shared/rpms.yml
# installs shared fonts
- from-file: shared/fonts.yml
# disables NetworkManager-online-service, flatpak update services,
# and enables topgrade updater
- from-file: shared/systemd.yml
# kernel selection
- type: rpm-ostree
repos:
- https://copr.fedorainfracloud.org/coprs/bieszczaders/kernel-cachyos-addons/repo/fedora-rawhide/bieszczaders-kernel-cachyos-addons-fedora-rawhide.repo #cachy uksmd
- https://copr.fedorainfracloud.org/coprs/bieszczaders/kernel-cachyos/repo/fedora-rawhide/bieszczaders-kernel-cachyos-fedora-rawhide.repo #cachy kernel
install:
- libcap-ng
- libcap-ng-devel
- procps-ng
- procps-ng-devel
- uksmd
- type: script
snippets:
- "echo 'Enable SElinux policy' && setsebool -P domain_kernel_load_modules on"
- "echo 'CachyOS kernel override' && rpm-ostree override remove kernel kernel-core kernel-modules kernel-modules-core kernel-modules-extra --install kernel-cachyos"
- type: systemd
system:
enabled:
- uksmd.service
# image-specific packages module
# base/core packages are all handled by solarpowered-raw
# and should not be added here.
# systemd services related to image-specific packages
# may also be placed within this module for simplicity
# ---
- type: rpm-ostree
repos:
- https://copr.fedorainfracloud.org/coprs/ilyaz/LACT/repo/fedora-rawhide/ilyaz-LACT-fedora-rawhide.repo #lact
install:
- lact-libadwaita
- nvtop
- type: systemd
system:
enabled:
- lactd.service
# disables all repos except for fedora and fedora-updates
- from-file: shared/disable-repos.yml
# files module
# copies files into /
# ---
- type: files
files:
# create a folder under files/ with the image name
# and place directories and files appropriately
# source entry should be the same name as the image name
- source: solarpowered-ex # image name, or folder as named under files/
destination: /
- type: signing

View File

@@ -0,0 +1,58 @@
name: solarpowered-raw
description: Custom desktop image based on the official, vanilla Fedora Silverblue image
base-image: quay.io/fedora-ostree-desktops/silverblue
image-version: 41
modules:
# this image obsoletes the need to specify many modules in derivative images
# and will only require the following modules:
# 1. image-specific packages (& related systemd services), if any
# 2. image-specific kernel
# contains repo files for codium, configs and services that will be shared across images
- from-file: shared/files.yml
# installs RPMFusion and dconf updater
- type: bling
install:
- rpmfusion
# - dconf-update-service
# installs negativo17-multimedia-repo & Cosign
# installed separately from the shared scripts module to ensure icons are installed properly
- type: script
scripts:
# - cosign.sh
- negativo17-multimedia-repo.sh
# installs and removes packages, this will apply to all solarpowered images
# includes installation entries for audio & codecs, CLI utilities, GUI apps,
# other system tools, prettifying packages, printing drivers for EPSON, and waydroid
# also includes removal entries for undesired fedora, gnome, free multimedia packages,
# and native installation of firefox
# also replaces gnome-shell & mutter packages with patched version
- from-file: packages/packages-raw.yml
# contains direct links for luminance & windscribe
- from-file: shared/shared-rpms.yml
# installs icons packs & nautilus extensions
- from-file: shared/script.yml
# installs shared fonts
- from-file: shared/fonts.yml
# contains gnome extensions that will be shared across all images
# does not contain several other extensions that must be installed locally
- from-file: shared/gnome-extensions.yml
# configures gschema for extensions, desktop, touchpad, and WM prefs
- from-file: shared/gschema-overrides.yml
# disables NetworkManager-online-service, flatpak update services,
# and enables topgrade updater
- from-file: shared/systemd.yml
- type: signing

View File

@@ -0,0 +1,247 @@
---
# yaml-language-server: $schema=https://schema.blue-build.org/recipe-v1.json
# enter image name here
name: autosolarpowered-rawhide
# enter image description here
description: Custom image for Lenovo T480/s devices, based on Vanilla Silverblue
# defines base image
# ---
base-image: quay.io/fedora-ostree-desktops/silverblue
# defines image major version
# ---
image-version: rawhide
modules:
- type: files
files:
- source: shared
destination: /
- type: bling
install:
# rpmfusion instead of negativo17 for rawhide
- rpmfusion
- type: script
scripts:
- shared/nautilus-copy-path.sh
- shared/tela-icon-theme.sh
- shared/qogir-icon-theme.sh
- type: rpm-ostree
repos:
- https://copr.fedorainfracloud.org/coprs/zhangyuannie/butter/repo/fedora-rawhide/zhangyuannie-butter-fedora-rawhide.repo
- https://copr.fedorainfracloud.org/coprs/tigro/better_fonts/repo/fedora-rawhide/tigro-better_fonts-fedora-rawhide.repo
- https://copr.fedorainfracloud.org/coprs/dusansimic/themes/repo/fedora-rawhide/dusansimic-themes-fedora-rawhide.repo
- https://copr.fedorainfracloud.org/coprs/shdwchn10/AllTheTools/repo/fedora-rawhide/shdwchn10-AllTheTools-fedora-rawhide.repo
- https://copr.fedorainfracloud.org/coprs/sneexy/zen-browser/repo/fedora-rawhide/sneexy-zen-browser-fedora-rawhide.repo
optfix:
- zen
install:
- alsa-firmware
- ffmpeg
- ffmpeg-libs
- ffmpegthumbnailer
- fontconfig-font-replacements
- gnome-epub-thumbnailer
- heif-pixbuf-loader
- intel-media-driver
- libcamera
- libcamera-gstreamer
- libcamera-ipa
- libcamera-tools
- libva-utils
- pipewire-plugin-libcamera
- pipewire-plugin-vulkan
- pulseaudio-utils
- uxplay
- vulkan-headers
- apr
- apr-util
- bootc
- distrobox
- fastfetch
- fish
- fzf
- ifuse
- inxi
- just
- kernel-tools
- lm_sensors
- lzip
- net-tools
- nvme-cli
- nvtop
- openssl
- smartmontools
- squashfs-tools
- starship
- symlinks
- tcpdump
- topgrade
- traceroute
- wireguard-tools
- wl-clipboard
- zstd
- baobab
- butter
- codium
- firewall-config
- gnome-boxes
- gnome-tweaks
- nautilus-extensions
- nautilus-python
- ptyxis
- zen-browser
- flatpak-spawn
- fuse
- grub2-tools-extra
- hunspell
- hunspell-en
- ibus-mozc
- input-remapper
- libappindicator
- libratbag-ratbagd
- ocl-icd
- openrgb-udev-rules
- steam-devices
- xorg-x11-server-Xwayland
- adw-gtk3-theme
- fonts-tweak-tool
- morewaita-icon-theme
- deepin-sound-theme
- oxygen-sounds
- pop-sound-theme
- yaru-sound-theme
- android-tools
- python3-pyclip
- waydroid
# nonfree-codecs
- ffmpeg
- gstreamer1-plugin-libav
- gstreamer1-plugins-bad-free-extras
- gstreamer1-plugins-bad-freeworld
- gstreamer1-plugins-ugly
- gstreamer1-vaapi
- mesa-va-drivers-freeworld
remove:
- fedora-bookmarks
- fedora-chromium-config
- fedora-chromium-config-gnome
- fedora-flathub-remote
- fedora-repos-archive
- fedora-repos-ostree
- fedora-third-party
- fedora-workstation-repositories
- fedora-workstation-backgrounds
- gnome-classic-session
- gnome-shell-extension-apps-menu
- gnome-shell-extension-background-logo
- gnome-shell-extension-launch-new-instance
- gnome-shell-extension-places-menu
- gnome-shell-extension-window-list
- gnome-software
- gnome-software-rpm-ostree
- gnome-system-monitor
- gnome-tour
- totem-video-thumbnailer
- default-fonts-cjk-sans
- firefox
- firefox-langpacks
- OpenCL-ICD-Loader
- rygel
- yelp
# free codecs
- fdk-aac-free
- ffmpeg-free
- libavcodec-free
- libavdevice-free
- libavfilter-free
- libavformat-free
- libavutil-free
- libpostproc-free
- libswresample-free
- libswscale-free
- mesa-va-drivers
replace:
- from-repo: https://copr.fedorainfracloud.org/coprs/trixieua/mutter-patched/repo/fedora-rawhide/trixieua-mutter-patched-fedora-rawhide.repo
packages:
- gnome-shell
- mutter
- mutter-common
- xorg-x11-server-Xwayland
- type: rpm-ostree
optfix:
- windscribe
# installs luminance & windscribe directly from github releases
- from-file: shared/rpms.yml
# installs shared fonts
- from-file: shared/fonts.yml
# disables NetworkManager-online-service, flatpak update services,
# and enables topgrade updater
- from-file: shared/systemd.yml
# kernel selection // blue doesn't have a successful build for rawhide
# - type: rpm-ostree
# replace:
# - from-repo: https://copr.fedorainfracloud.org/coprs/sentry/kernel-blu/repo/fedora-rawhide/sentry-kernel-blu-fedora-rawhide.repo
# packages:
# - kernel
# - kernel-core
# - kernel-headers
# - kernel-modules
# - kernel-modules-core
# - kernel-modules-extra
# image-specific packages module
# base/core packages are all handled by solarpowered-raw
# and should not be added here.
# systemd services related to image-specific packages
# may also be placed within this module for simplicity
# ---
- type: rpm-ostree
repos:
- https://copr.fedorainfracloud.org/coprs/abn/throttled/repo/fedora-rawhide/abn-throttled-fedora-rawhide.repo
- https://copr.fedorainfracloud.org/coprs/sneexy/python-validity/repo/fedora-rawhide/sneexy-python-validity-fedora-rawhide.repo
install:
- igt-gpu-tools
- fprintd-clients
- fprintd-clients-pam
- open-fprintd
- python3-validity
- tlp
- tlp-rdw
- throttled
- zcfan
remove:
- fprintd
- fprintd-pam
- thermald
- tuned-ppd
- tuned
- type: systemd
system:
enabled:
- tlp.service
masked:
- systemd-rfkill.service
- systemd-rfkill.socket
# disables all repos except for fedora and fedora-updates
- from-file: shared/disable-repos.yml
# files module
# copies files into /
# ---
- type: files
files:
# create a folder under files/ with the image name
# and place directories and files appropriately
# source entry should be the same name as the image name
- source: solarpowered # image name, or folder as named under files/
destination: /
- type: signing

View File

@@ -0,0 +1,24 @@
modules:
- type: rpm-ostree
remove:
- firefox
- firefox-langpacks
- google-noto-sans-balinese-fonts
- google-noto-sans-javanese-fonts
- google-noto-sans-sundanese-fonts
- htop
- rygel
- ublue-os-update-services
#unnecessary gnomies
- gnome-software
- gnome-system-monitor
- gnome-tour
- yelp
#fedora default gnome extensions
- gnome-shell-extension-apps-menu
- gnome-shell-extension-background-logo
- gnome-shell-extension-launch-new-instance
- gnome-shell-extension-places-menu
- gnome-shell-extension-window-list
#gnome xorg
- gnome-classic-session

View File

@@ -0,0 +1,64 @@
modules:
- type: rpm-ostree
repos:
- https://copr.fedorainfracloud.org/coprs/hyperreal/better_fonts/repo/fedora-%OS_VERSION%/hyperreal-better_fonts-fedora-%OS_VERSION%.repo #better fonts
- https://copr.fedorainfracloud.org/coprs/zhangyuannie/butter/repo/fedora-%OS_VERSION%/zhangyuannie-butter-fedora-%OS_VERSION%.repo #butter
- https://copr.fedorainfracloud.org/coprs/dusansimic/themes/repo/fedora-%OS_VERSION%/dusansimic-themes-fedora-%OS_VERSION%.repo #morewaita
- https://copr.fedorainfracloud.org/coprs/shdwchn10/AllTheTools/repo/fedora-%OS_VERSION%/shdwchn10-AllTheTools-fedora-%OS_VERSION%.repo #starship & topgrade
- https://copr.fedorainfracloud.org/coprs/sneexy/zen-browser/repo/fedora-%OS_VERSION%/sneexy-zen-browser-fedora-%OS_VERSION%.repo #zen
optfix:
- windscribe
- zen
install:
- baobab
- butter
- codium
- epson-inkjet-printer-escpr
- epson-inkjet-printer-escpr2
- fish
- firewall-config
- fontconfig-font-replacements
- gnome-boxes
- hunspell
- hunspell-en
- ibus-mozc
- ifuse
- input-remapper
- inxi
- lm_sensors
- libappindicator
- ptyxis
- pulseaudio-utils
- rsms-inter-fonts
- starship
- steam-devices
- topgrade
- uxplay
- wl-clipboard
- xorg-x11-server-Xwayland
- zen-browser
- openssl
- nautilus-python
- nautilus-extensions
- https://github.com/sidevesh/Luminance/releases/download/1.1.0/luminance-1.1.0.rpm
# extra niceties
- deepin-sound-theme
- fastfetch
- fonts-tweak-tool
- morewaita-icon-theme
- oxygen-sounds
- pop-sound-theme
- yaru-sound-theme
# waydroid
- android-tools
- lzip
- waydroid
# windscribe
- https://github.com/Windscribe/Desktop-App/releases/download/v2.14.4/windscribe_2.14.4_guinea_pig_x86_64_fedora.rpm
replace:
- from-repo: https://copr.fedorainfracloud.org/coprs/trixieua/mutter-patched/repo/fedora-%OS_VERSION%/trixieua-mutter-patched-fedora-%OS_VERSION%.repo
packages:
- gnome-shell
- mutter
- mutter-common
- xorg-x11-server-Xwayland

View File

@@ -0,0 +1,204 @@
modules:
- type: bling
install:
- rpmfusion
- type: rpm-ostree
repos:
- https://copr.fedorainfracloud.org/coprs/zhangyuannie/butter/repo/fedora-%OS_VERSION%/zhangyuannie-butter-fedora-%OS_VERSION%.repo #butter
- https://copr.fedorainfracloud.org/coprs/dusansimic/themes/repo/fedora-%OS_VERSION%/dusansimic-themes-fedora-%OS_VERSION%.repo #morewaita
- https://copr.fedorainfracloud.org/coprs/ilyaz/LACT/repo/fedora-%OS_VERSION%/ilyaz-LACT-fedora-%OS_VERSION%.repo #lact
- https://copr.fedorainfracloud.org/coprs/shdwchn10/AllTheTools/repo/fedora-%OS_VERSION%/shdwchn10-AllTheTools-fedora-%OS_VERSION%.repo #starship & topgrade
- https://copr.fedorainfracloud.org/coprs/ublue-os/staging/repo/fedora-%OS_VERSION%/ublue-os-staging-fedora-%OS_VERSION%.repo # ublue-os staging
- https://copr.fedorainfracloud.org/coprs/sneexy/zen-browser/repo/fedora-%OS_VERSION%/sneexy-zen-browser-fedora-%OS_VERSION%.repo #zen browser
optfix:
- windscribe
- zen
install:
- alsa-ucm
- alsa-utils
- android-udev-rules
- anthy-unicode
- apr
- apr-util
- audit
- audit-rules
- avahi-gobject
- avahi-tools
- baobab
- bluez-cups
- buildah
- cairo
- cldr-emoji-annotation
- cldr-emoji-annotation-dtd
- cups
- cups-filters
- dbus-glib
- dconf
- default-fonts-cjk-mono
- default-fonts-cjk-serif
- default-fonts-core-emoji
- default-fonts-core-math
- default-fonts-core-mono
- default-fonts-core-serif
- default-fonts-other-mono
- default-fonts-other-sans
- default-fonts-other-serif
- desktop-backgrounds-gnome
- dhcp-client
- dhcp-common
- distribution-gpg-keys
- djvulibre-libs
- dnf5-plugins
- dotconf
- firewall-config
- flatpak
- flatpak-spawn
- fprintd-pam
- fuse
- fuse-common
- fuse-libs
- fuse-overlayfs
- fuse3
- fuse3-libs
- fwupd
- gamemode
- gdm
- ghostscript
- git
- git-credential-libsecret
- glib-networking
- gnome-boxes
- gnome-bluetooth
- gnome-browser-connector
- gnome-control-center
- gnome-disk-utility
- gnome-epub-thumbnailer
- gnome-session-wayland-session
- gnome-shell
- gnome-user-share
- google-noto-color-emoji-fonts
- google-noto-sans-cjk-fonts
- gsettings-desktop-schemas
- gstreamer1-plugin-libav
- gstreamer1-plugin-openh264
- gstreamer1-plugins-bad-free
- gstreamer1-plugins-good
- gstreamer1-plugins-ugly-free
- gutenprint
- gvfs-afc
- gvfs-afp
- gvfs-archive
- gvfs-client
- gvfs-fuse
- gvfs-goa
- gvfs-gphoto2
- gvfs-mtp
- gvfs-nfs
- gvfs-smb
- ibus-anthy
- ibus-gtk4
- ifuse
- iwlwifi-dvm-firmware
- iwlwifi-mvm-firmware
- kernel-modules-extra
- langpacks-core-en
- mesa-dri-drivers
- mesa-libEGL
- mesa-va-drivers
- mesa-vulkan-drivers
- ModemManager
- mutter
- nautilus
- nss-mdns
- NetworkManager
- NetworkManager-adsl
- NetworkManager-bluetooth
- NetworkManager-config-connectivity-fedora
- NetworkManager-openconnect-gnome
- NetworkManager-openvpn-gnome
- NetworkManager-ppp
- NetworkManager-pptp
- NetworkManager-pptp-gnome
- NetworkManager-ssh-gnome
- NetworkManager-vpnc-gnome
- NetworkManager-wifi
- NetworkManager-wwan
- PackageKit-command-not-found
- PackageKit-gstreamer-plugin
- PackageKit-gtk3-module
- pango
- pipewire
- pipewire-alsa
- pipewire-pulseaudio
- pipewire-utils
- plymouth
- polkit
- ptyxis
- python3-pyxdg
- rsms-inter-fonts
- samba-client
- sane-backends-drivers-scanners
- sushi
- system-config-printer-udev
- wireguard-tools
- wireplumber
- xdg-dbus-proxy
- xdg-desktop-portal
- xdg-desktop-portal-gnome
- xdg-desktop-portal-gtk
- xdg-user-dirs-gtk
- xdg-utils
# basic stuff
- adw-gtk3-theme
- alsa-firmware
- android-tools
- butter
- codium
- deepin-sound-theme
- distrobox
- epson-inkjet-printer-escpr
- epson-inkjet-printer-escpr2
- fastfetch
- ffmpeg
- ffmpegthumbnailer
- fish
- gnome-tweaks
- heif-pixbuf-loader
- hunspell
- hunspell-en
- inxi
- just
- libappindicator
- libheif-freeworld
- libheif-tools
- libva-utils
- lm_sensors
- lzip
- morewaita-icon-theme
- nautilus-extensions
- nautilus-python
- openrgb
- openrgb-udev-rules
- openssl
- oxygen-sounds
- pop-sound-theme
- starship
- topgrade
- unzip
- uxplay
- waydroid
- wl-clipboard
- xorg-x11-server-Xwayland
- yaru-sound-theme
- zen-browser
- zstd
- https://github.com/sidevesh/Luminance/releases/download/1.1.0/luminance-1.1.0.rpm
- https://github.com/Windscribe/Desktop-App/releases/download/v2.13.8/windscribe_2.13.8_x86_64_fedora.rpm
replace:
- from-repo: https://copr.fedorainfracloud.org/coprs/trixieua/mutter-patched/repo/fedora-%OS_VERSION%/trixieua-mutter-patched-fedora-%OS_VERSION%.repo
packages:
- gnome-shell
- mutter
- mutter-common
- xorg-x11-server-Xwayland

View File

@@ -0,0 +1,4 @@
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEnz+kko9HwCdM4RYio+lTmDzpzGkL
1GBz4Y92qGyn0eXUFwI7zxsO2u6C+Bs4FTn9bgmmyfrMjTrYYGgKJApq6Q==
-----END PUBLIC KEY-----

View File

@@ -0,0 +1,24 @@
# README.md
This folder contains
# gschema-overrides/
gschema-overrides files for all images
# scripts/
Scripts for from-scratch images (`base/`), images regardless of base (`shared/`), and for `solarizzed`.
# shared/
Files that will be transferred into all images' /.
# solarpowered/
Files that will be transferred into /. Only for `solarpowered` and `autosolarpowered`. Device-specific. Contains T480/s config files.
# solarpowered-ex/
Files that will be transferred into /. Only for `solarpowered-ex` and `autosolarpowered-ex`. Device-specific. Contains `B550-suspend-fix.service`.

View File

@@ -0,0 +1,8 @@
[gitlab.com_paulcarroty_vscodium_repo]
name=gitlab.com_paulcarroty_vscodium_repo
baseurl=https://paulcarroty.gitlab.io/vscodium-deb-rpm-repo/rpms/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://gitlab.com/paulcarroty/vscodium-deb-rpm-repo/raw/master/pub.gpg
metadata_expire=1h

View File

@@ -0,0 +1,3 @@
# README.md
This folder contains gschema-overrides files.

View File

@@ -0,0 +1,5 @@
[org.gnome.desktop.app-folders.folders.Waydroid]
apps=['Waydroid.desktop']
categories=['X-WayDroid-App']
name='Waydroid'
translate=false

View File

@@ -0,0 +1,4 @@
[org.gnome.shell]
disable-user-extensions=false
enabled-extensions=['nightthemeswitcher@romainvigier.fr', 'do-not-disturb-while-screen-sharing-or-recording@marcinjahn.com', 'caffeine@patapon.info', 'Bluetooth-Battery-Meter@maniacx.github.com', 'light-style@gnome-shell-extensions.gcampax.github.com', 'hibernate-status@dromi', 'gsconnect@andyholmes.github.io']

View File

@@ -0,0 +1,5 @@
[org.gnome.desktop.background]
color-shading-type='solid'
picture-options='zoom'
primary-color='#000000'
secondary-color='#000000'

View File

@@ -0,0 +1,11 @@
[org.gnome.desktop.interface]
accent-color='purple'
enable-hot-corners=false
clock-format='24h'
clock-show-weekday=false
show-battery-percentage=true
font-antialiasing='rgba'
font-hinting='none'
font-rendering='automatic'
gtk-theme='adw-gtk3'

View File

@@ -0,0 +1,3 @@
[org.gnome.desktop.peripherals.touchpad]
tap-to-click=true
two-finger-scrolling-enabled=true

View File

@@ -0,0 +1,3 @@
[org.gnome.desktop.wm.preferences]
action-double-click-titlebar='toggle-maximize'
titlebar-uses-system-font=true

View File

@@ -0,0 +1,3 @@
[org.gnome.mutter]
center-new-windows=true
check-alive-timeout=30000

View File

@@ -0,0 +1,4 @@
[org.gnome.nautilus.preferences]
default-sort-order='type'
show-create-link=true
show-delete-permanently=true

View File

@@ -0,0 +1,15 @@
# README.md
This folder contains
## base/
Scripts for use with DIY images, based on vanilla Fedora Silverblue as opposed to UBlue's `silverblue-main`
# shared/
Scripts for use with all images regardless of base
# solarizzed/
Scripts for use with `solarizzed` only, mainly contains KDE Plasma-related scripts

View File

@@ -0,0 +1,10 @@
#!/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
# Your code goes here.
echo 'This is an example shell script'
echo 'Scripts here will run during build if specified in recipe.yml'

View File

@@ -0,0 +1,25 @@
#!/usr/bin/env bash
set -ouex pipefail
OS_VERSION=$(rpm -E %fedora)
VER=$(basename $(curl -Ls -o /dev/null -w %{url_effective} https://github.com/bazzite-org/kernel-bazzite/releases/latest))
dnf -y remove kernel-* && rm -drf /usr/lib/modules/*
echo 'Installing Bazzite kernel...'
dnf install -y \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-common-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-core-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-devel-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-devel-matched-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-modules-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-modules-akmods-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-modules-core-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-modules-extra-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-modules-extra-matched-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-modules-internal-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-tools-$VER.fc$OS_VERSION.x86_64.rpm \
https://github.com/bazzite-org/kernel-bazzite/releases/download/$VER/kernel-tools-libs-$VER.fc$OS_VERSION.x86_64.rpm

View File

@@ -0,0 +1,50 @@
#!/usr/bin/env bash
# Remove Fedora kernel & remove leftover files
dnf -y remove \
kernel \
kernel-* && \
rm -r -f /usr/lib/modules/*
# Install dnf-plugins-core just in case
dnf -y install --setopt=install_weak_deps=False \
dnf-plugins-core \
dnf5-plugins
# Configure exclusion
dnf -y config-manager setopt "fedora*".exclude=" \
kernel \
kernel-core \
kernel-modules \
kernel-modules-core \
kernel-modules-extra \
kernel-devel \
kernel-headers \
"
# Enable repos for kernel-blu and akmods
dnf -y copr enable sentry/kernel-blu
# dnf -y copr enable ublue-os/akmods
dnf -y config-manager addrepo --from-repofile=https://raw.githubusercontent.com/terrapkg/subatomic-repos/main/terra.repo
dnf -y config-manager addrepo --from-repofile=https://negativo17.org/repos/fedora-multimedia.repo
# Install akmods, kernel, and modules
dnf -y install --setopt=install_weak_deps=False \
kernel \
kernel-devel \
kernel-modules-extra \
akmods \
akmod-evdi \
help2man \
v4l2loopback \
zenergy
# Manually build modules, run depmod & generate initramfs
VER=$(ls /lib/modules) &&
akmods --force --kernels $VER --kmod v4l2loopback &&
akmods --force --kernels $VER --kmod zenergy &&
depmod -a $VER &&
dracut --kver $VER --force --add ostree --no-hostonly --reproducible /usr/lib/modules/$VER/initramfs.img
# Clean up repos from earlier
rm -f /etc/yum.repos.d/{*copr*,*terra*,*multimedia*}.repo

View File

@@ -0,0 +1,56 @@
#!/usr/bin/env bash
# Remove Fedora kernel & remove leftover files
dnf -y remove \
kernel \
kernel-* && \
rm -r -f /usr/lib/modules/*
# Install dnf-plugins-core just in case
dnf -y install --setopt=install_weak_deps=False \
dnf-plugins-core \
dnf5-plugins
# Enable repos
dnf -y copr enable bieszczaders/kernel-cachyos-lto
dnf -y copr enable bieszczaders/kernel-cachyos-addons
# dnf -y copr enable ublue-os/akmods
dnf -y config-manager addrepo --from-repofile=https://negativo17.org/repos/fedora-multimedia.repo
dnf -y config-manager addrepo --from-repofile=https://raw.githubusercontent.com/terrapkg/subatomic-repos/main/terra.repo
# Handles kernel post-transaction scriptlet
# mv /usr/lib/kernel/install.d/05-rpmostree.install /usr/lib/kernel/install.d/05-rpmostree.install.bak
# mv /usr/lib/kernel/install.d/50-dracut.install /usr/lib/kernel/install.d/50-dracut.install.bak
# printf '%s\n' '#!/bin/sh' 'exit 0' > /usr/lib/kernel/install.d/05-rpmostree.install
# printf '%s\n' '#!/bin/sh' 'exit 0' > /usr/lib/kernel/install.d/50-dracut.install
# chmod +x \
# /usr/lib/kernel/install.d/05-rpmostree.install \
# /usr/lib/kernel/install.d/50-dracut.install
# Install CachyOS LTO kernel & akmods
dnf -y install --setopt=install_weak_deps=False \
kernel-cachyos-lto \
kernel-cachyos-lto-devel \
akmods \
akmod-evdi \
zenergy \
scx-scheds \
scx-tools \
scx-manager
dnf -y swap zram-generator-defaults cachyos-settings
# Handles kernel post-transaction scriptlet
# rm -f /usr/lib/kernel/install.d/05-rpmostree.install \
# /usr/lib/kernel/install.d/50-dracut.install
# mv /usr/lib/kernel/install.d/05-rpmostree.install.bak /usr/lib/kernel/install.d/05-rpmostree.install
# mv /usr/lib/kernel/install.d/50-dracut.install.bak /usr/lib/kernel/install.d/50-dracut.install
# Manually build modules, run depmod & generate initramfs
VER=$(ls /lib/modules) && \
akmods --force --kernels $VER --kmod zenergy && \
akmods --force --kernels $VER --kmod evdi && \
depmod -a $VER && \
dracut --kver $VER --force --add ostree --no-hostonly --reproducible /usr/lib/modules/$VER/initramfs.img
# Clean up repos from earlier
rm -f /etc/yum.repos.d/{*copr*,*multimedia*,*terra*}.repo

View File

@@ -0,0 +1,31 @@
#!/usr/bin/env bash
# Install dnf-plugins-core just in case
dnf -y install --setopt=install_weak_deps=False \
dnf-plugins-core \
dnf5-plugins
# Enable repos for akmods
dnf -y copr enable ublue-os/akmods
dnf -y config-manager addrepo --from-repofile=https://raw.githubusercontent.com/terrapkg/subatomic-repos/main/terra.repo
dnf config-manager addrepo --from-repofile=https://negativo17.org/repos/fedora-multimedia.repo
# Install akmods, kernel, and modules
dnf -y install --setopt=install_weak_deps=False \
kernel-devel \
kernel-modules-extra \
akmods \
akmod-evdi \
help2man \
v4l2loopback \
zenergy
# Manually build modules, run depmod & generate initramfs
VER=$(ls /lib/modules) &&
akmods --force --kernels $VER --kmod v4l2loopback &&
akmods --force --kernels $VER --kmod zenergy &&
depmod -a $VER &&
dracut --kver $VER --force --add ostree --no-hostonly --reproducible /usr/lib/modules/$VER/initramfs.img
# Clean up repos from earlier
rm -f /etc/yum.repos.d/{*copr*,*terra*,*multimedia*}.repo

View File

@@ -0,0 +1,18 @@
#!/usr/bin/env bash
set -oue pipefail
echo 'Preparing directory for cloning...'
mkdir -p /tmp/clone/Adwaita-colors/
cd /tmp/clone/Adwaita-colors/
echo 'Directory created.'
git clone https://github.com/dpejoh/Adwaita-colors
echo 'Repo cloned. Copying files...'
cp -r ./Adwaita-colors/* /usr/share/icons/
echo 'Folders copied. Cleaning up!'
rm -r Adwaita-colors/
echo 'Cloned repo deleted.'

View File

@@ -0,0 +1,18 @@
#!/usr/bin/env bash
VER=$(basename $(curl -Ls -o /dev/null -w %{url_effective} https://github.com/pkgforge-dev/android-tools-AppImage/releases/latest))
curl -fLs --create-dirs https://github.com/pkgforge-dev/android-tools-AppImage/releases/download/${VER}/Android_Tools-${VER%@*}-anylinux-x86_64.AppImage -o /usr/bin/android-tools
chmod +x /usr/bin/android-tools
mkdir -p /tmp/android-tmp/
(
cd /tmp/android-tmp/
/usr/bin/android-tools --appimage-extract
)
readarray -t BINS < <(find /tmp/android-tmp/AppDir/bin/ -type f -printf "%f\n")
rm -rf /tmp/android-tmp/
for bin in "${BINS[@]}"; do
case "$bin" in
*xdg-open|*.hook|*.conf) continue;;
esac
ln -fs /usr/bin/android-tools /usr/bin/"$bin"
done

View File

@@ -0,0 +1,32 @@
#!/usr/bin/env bash
set -oue pipefail
GITHUB_URL="https://github.com/vinceliuice/Colloid-icon-theme"
if [ -z "$GITHUB_URL" ]; then
echo "Error: GITHUB_URL is not set."
exit 1
fi
REPO_NAME=$(basename "$GITHUB_URL" .git)
CLONE_DIR="/tmp/clone/$REPO_NAME"
echo "Preparing directory for cloning..."
mkdir -p "$CLONE_DIR"
cd "$CLONE_DIR"
echo "Directory created."
git clone "$GITHUB_URL"
echo "Repo cloned. Copying files..."
if [ -f "./$REPO_NAME/install.sh" ]; then
chmod +x "./$REPO_NAME/install.sh"
./"$REPO_NAME/install.sh" -d /usr/share/icons -s default -t default -b
fi
echo "Folders copied. Cleaning up!"
rm -drf "$CLONE_DIR"
echo "Cloned repo deleted."
echo "Script finished. Theme installation complete."

View File

@@ -0,0 +1,7 @@
#!/usr/bin/env bash
set -euox pipefail
tee "/etc/dracut.conf.d/00-dp-2.conf" > /dev/null << 'EOF'
install_items+=" /lib/firmware/edid/edid.bin "
EOF

View File

@@ -0,0 +1,49 @@
#!/usr/bin/env bash
set -oue pipefail
GITHUB_URL="https://github.com/somepaulo/MoreWaita"
if [ -z "$GITHUB_URL" ]; then
echo "Error: GITHUB_URL is not set."
exit 1
fi
REPO_NAME=$(basename "$GITHUB_URL" .git)
CLONE_DIR="/tmp/clone/$REPO_NAME"
echo "Preparing directory for cloning..."
mkdir -p "$CLONE_DIR"
cd "$CLONE_DIR"
echo "Directory created."
git clone "$GITHUB_URL"
echo "Repo cloned. Copying files..."
if [ -f "./$REPO_NAME/install.sh" ]; then
chmod +x "./$REPO_NAME/install.sh"
./"$REPO_NAME/install.sh"
fi
echo "Folders copied. Cleaning up!"
rm -drf "$CLONE_DIR"
echo "Cloned repo deleted."
echo "Script finished. Theme installation complete."
# ---
# echo 'Preparing directory for cloning...'
# mkdir -p /tmp/clone/MoreWaita/
# cd /tmp/clone/MoreWaita/
# echo 'Directory created.'
# git clone https://github.com/somepaulo/MoreWaita.git
# echo 'Repo cloned. Running install script...'
# MoreWaita/install.sh
# cho 'Install script finished. Removing cloned repo...'
# rm -r MoreWaita
# echo 'Cloned repo deleted.'

View File

@@ -0,0 +1,22 @@
#!/usr/bin/env bash
set -oue pipefail
echo 'Preparing directory for cloning...'
mkdir -p /tmp/clone/nautilus-copy-path/
cd /tmp/clone/nautilus-copy-path/
echo 'Directory created.'
git clone https://github.com/chr314/nautilus-copy-path.git
echo 'Repo cloned. Copying files...'
mkdir -p /usr/share/nautilus-python/extensions/nautilus-copy-path
cp ./nautilus-copy-path/nautilus-copy-path.py /usr/share/nautilus-python/extensions
cp ./nautilus-copy-path/nautilus_copy_path.py ./nautilus-copy-path/translation.py ./nautilus-copy-path/config.json /usr/share/nautilus-python/extensions/nautilus-copy-path
cp -rf ./nautilus-copy-path/translations /usr/share/nautilus-python/extensions/nautilus-copy-path
echo 'Install script finished. Removing cloned repo...'
rm -r nautilus-copy-path
echo 'Cloned repo deleted.'

View File

@@ -0,0 +1,32 @@
#!/usr/bin/env bash
set -oue pipefail
GITHUB_URL="https://github.com/vinceliuice/Qogir-icon-theme"
if [ -z "$GITHUB_URL" ]; then
echo "Error: GITHUB_URL is not set."
exit 1
fi
REPO_NAME=$(basename "$GITHUB_URL" .git)
CLONE_DIR="/tmp/clone/$REPO_NAME"
echo "Preparing directory for cloning..."
mkdir -p "$CLONE_DIR"
cd "$CLONE_DIR"
echo "Directory created."
git clone "$GITHUB_URL"
echo "Repo cloned. Copying files..."
if [ -f "./$REPO_NAME/install.sh" ]; then
chmod +x "./$REPO_NAME/install.sh"
./"$REPO_NAME/install.sh" -t default -c standard
fi
echo "Folders copied. Cleaning up!"
rm -drf "$CLONE_DIR"
echo "Cloned repo deleted."
echo "Script finished. Theme installation complete."

View File

@@ -0,0 +1,32 @@
#!/usr/bin/env bash
set -oue pipefail
GITHUB_URL="https://github.com/vinceliuice/Tela-icon-theme"
if [ -z "$GITHUB_URL" ]; then
echo "Error: GITHUB_URL is not set."
exit 1
fi
REPO_NAME=$(basename "$GITHUB_URL" .git)
CLONE_DIR="/tmp/clone/$REPO_NAME"
echo "Preparing directory for cloning..."
mkdir -p "$CLONE_DIR"
cd "$CLONE_DIR"
echo "Directory created."
git clone "$GITHUB_URL"
echo "Repo cloned. Copying files..."
if [ -f "./$REPO_NAME/install.sh" ]; then
chmod +x "./$REPO_NAME/install.sh"
./"$REPO_NAME/install.sh" -d /usr/share/icons
fi
echo "Folders copied. Cleaning up!"
rm -drf "$CLONE_DIR"
echo "Cloned repo deleted."
echo "Script finished. Theme installation complete."

View File

@@ -0,0 +1,68 @@
# Arch Linux box for CLI use
[box]
image=ghcr.io/askpng/box
pull=true
replace=true
nvidia=false
init=false
entry=false
start_now=true
init_hooks=ln -sf /usr/bin/distrobox-host-exec /usr/local/bin/xdg-open
exported_apps="blackbox"
exported_bins="bat btop eza glow pingu tldr"
# Arch Linux box for gaming use
[gamebox]
image=ghcr.io/askpng/gamebox:latest
pull=true
replace=true
nvidia=false
init=false
entry=false
start_now=true
init_hooks=ln -sf /usr/bin/distrobox-host-exec /usr/local/bin/xdg-open
exported_apps="blackbox celluloid hatt lutris megabasterd steam vesktop"
# BlueBuild-CLI
[bluebuild-cli]
image=ghcr.io/blue-build/cli:latest-alpine
additional_packages="nano bat fish git"
replace=true
# Debian
[debian]
image=quay.io/toolbx-images/debian-toolbox:unstable
additional_packages="nano bat fish"
replace=true
[fedora]
image=ghcr.io/ublue-os/fedora-distrobox:latest
additional_packages="nano bat fish"
#[bluefin-cli]
#image=ghcr.io/ublue-os/bluefin-cli
#nvidia=true
#[opensuse]
#image=quay.io/toolbx-images/opensuse-toolbox:tumbleweed
#nvidia=true
#[ubuntu]
#image=ghcr.io/ublue-os/ubuntu-toolbox:latest
#nvidia=true
#[alma]
#image=quay.io/toolbx-images/almalinux-toolbox:latest
#nvidia=true
#[centos]
#image=quay.io/toolbx-images/centos-toolbox:latest
#nvidia=true
#[wolfi]
#image=ghcr.io/ublue-os/wolfi-toolbox
#nvidia=true
#[wolfi-dx]
#image=ghcr.io/ublue-os/wolfi-dx-toolbox
#nvidia=true

View File

@@ -0,0 +1,4 @@
container_always_pull="1"
container_generate_entry=1
container_manager="podman"
non_interactive="1"

View File

@@ -0,0 +1,7 @@
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# For option meanings, see rpm-ostreed.conf(5).
[Daemon]
AutomaticUpdatePolicy=stage
#IdleExitTimeout=60

View File

@@ -0,0 +1,50 @@
################### File Generated by Goverlay ###################
legacy_layout=false
background_alpha=0.0
round_corners=0
background_alpha=0.0
background_color=000000
font_size=14
text_color=FFFFFF
position=top-left
toggle_hud=Shift_R+F12
pci_dev=0:08:00.0
table_columns=3
gpu_text=GPU
gpu_stats
gpu_temp
gpu_color=2E9762
cpu_text=CPU
cpu_stats
cpu_temp
cpu_color=2E97CB
vram
vram_color=AD64C1
ram
ram_color=C26693
fps
fps_limit_method=late
toggle_fps_limit=Shift_L+F1
fps_limit=90
fps_color_change
fps_color=B22222,F9F06B,99C1F1
fps_value=30,90
#offset=0
output_folder=/var/home/mel
log_duration=30
autostart_log=0
log_interval=100
toggle_logging=Shift_L+F2

View File

@@ -0,0 +1,42 @@
## GENERAL ##
## profile ##
profile=fast
## hardware acceleration ##
# vo=gpu-next
# hwdec=auto
gpu-context=wayland,auto
vo=dmabuf-wayland,gpu-next
hwdec=auto-safe
# others #
save-position-on-quit=yes
keep-open=yes
border=yes
screenshot-directory="~/Pictures/mpv/"
screenshot-template="%F - [%P]v%#01n"
screenshot-format=webp
screenshot-webp-quality=90
slang=eng,en,enUS,en-US,English,jpn,jp,jap,Japanese
sub-font-size=32
volume-max=100
## INPUT ##
## OSD ##
osd-duration=2000
osd-playing-msg='${filename}'
# osc-seekbarstyle=bar
# osd-font-size=20
## resize window ##
autofit-larger=75%x75%
## yt-dlp ##
[protocol.https]
prefetch-playlist=yes
cache-secs=10
osd-playing-msg='${media-title}'
ytdl-format="bestvideo[height<=1080]+bestaudio"
ytdl-raw-options=cookies-from-browser=firefox

View File

@@ -0,0 +1,333 @@
-- Copyright (c) 2021, Eisa AlAwadhi
-- License: BSD 2-Clause License
-- Creator: Eisa AlAwadhi
-- Project: SmartCopyPaste
-- Version: 2.4.1
local utils = require 'mp.utils'
local msg = require 'mp.msg'
local protocols
local extensions
local pasted = false
----------------------------USER CUSTOMIZATION SETTINGS-----------------------------------
--These settings are for users to manually change some options in the script.
--Keybinds can be defined in the bottom of the script.
local device = nil --nil is for automatic device detection, or manually change to: 'windows' or 'mac' or 'linux'
local linux_copy = 'wl-copy' --copy command that will be used in Linux. OR write a different command
local linux_paste = 'wl-paste' --paste command that will be used in Linux. OR write a different command
local mac_copy = 'pbcopy' --copy command that will be used in MAC. OR write a different command
local mac_paste = 'pbpaste' --paste command that will be used in MAC. OR write a different command
local windows_copy = 'powershell' --'powershell' is for using windows powershell to copy. OR write the copy command, e.g: ' clip'
local windows_paste = 'powershell' --'powershell' is for using windows powershell to paste. OR write the paste command
local offset = -0.65 --change to 0 so that pasting resumes from the exact position, or decrease the value so that it gives you a little preview before reaching the exact pasted position
local paste_anything = false --false is for specific paste based on the specified extensions and protocols. Change to true so paste accepts anything (not recommended to change this).
if not paste_anything then
protocols = { --add below (after a comma) any protocol you want SmartCopyPaste to work with; e.g: ,'ftp://'
'https?://' ,'magnet:'
}
extensions = { --add below (after a comma) any extension you want SmartCopyPaste to work with; e.g: ,'pdf'
--video & audio
'ac3', 'a52', 'eac3', 'mlp', 'dts', 'dts-hd', 'dtshd', 'true-hd', 'thd', 'truehd', 'thd+ac3', 'tta', 'pcm', 'wav', 'aiff', 'aif', 'aifc', 'amr', 'awb', 'au', 'snd', 'lpcm', 'yuv', 'y4m', 'ape', 'wv', 'shn', 'm2ts', 'm2t', 'mts', 'mtv', 'ts', 'tsv', 'tsa', 'tts', 'trp', 'adts', 'adt', 'mpa', 'm1a', 'm2a', 'mp1', 'mp2', 'mp3', 'mpeg', 'mpg', 'mpe', 'mpeg2', 'm1v', 'm2v', 'mp2v', 'mpv', 'mpv2', 'mod', 'tod', 'vob', 'vro', 'evob', 'evo', 'mpeg4', 'm4v', 'mp4', 'mp4v', 'mpg4', 'm4a', 'aac', 'h264', 'avc', 'x264', '264', 'hevc', 'h265', 'x265', '265', 'flac', 'oga', 'ogg', 'opus', 'spx', 'ogv', 'ogm', 'ogx', 'mkv', 'mk3d', 'mka', 'webm', 'weba', 'avi', 'vfw', 'divx', '3iv', 'xvid', 'nut', 'flic', 'fli', 'flc', 'nsv', 'gxf', 'mxf', 'wma', 'wm', 'wmv', 'asf', 'dvr-ms', 'dvr', 'wtv', 'dv', 'hdv', 'flv','f4v', 'f4a', 'qt', 'mov', 'hdmov', 'rm', 'rmvb', 'ra', 'ram', '3ga', '3ga2', '3gpp', '3gp', '3gp2', '3g2', 'ay', 'gbs', 'gym', 'hes', 'kss', 'nsf', 'nsfe', 'sap', 'spc', 'vgm', 'vgz', 'm3u', 'm3u8', 'pls', 'cue',
--images
"ase", "art", "bmp", "blp", "cd5", "cit", "cpt", "cr2", "cut", "dds", "dib", "djvu", "egt", "exif", "gif", "gpl", "grf", "icns", "ico", "iff", "jng", "jpeg", "jpg", "jfif", "jp2", "jps", "lbm", "max", "miff", "mng", "msp", "nitf", "ota", "pbm", "pc1", "pc2", "pc3", "pcf", "pcx", "pdn", "pgm", "PI1", "PI2", "PI3", "pict", "pct", "pnm", "pns", "ppm", "psb", "psd", "pdd", "psp", "px", "pxm", "pxr", "qfx", "raw", "rle", "sct", "sgi", "rgb", "int", "bw", "tga", "tiff", "tif", "vtf", "xbm", "xcf", "xpm", "3dv", "amf", "ai", "awg", "cgm", "cdr", "cmx", "dxf", "e2d", "egt", "eps", "fs", "gbr", "odg", "svg", "stl", "vrml", "x3d", "sxd", "v2d", "vnd", "wmf", "emf", "art", "xar", "png", "webp", "jxr", "hdp", "wdp", "cur", "ecw", "iff", "lbm", "liff", "nrrd", "pam", "pcx", "pgf", "sgi", "rgb", "rgba", "bw", "int", "inta", "sid", "ras", "sun", "tga",
--other types
'torrent'
}
---------------------------END OF USER CUSTOMIZATION SETTINGS------------------------
else
protocols = {''}
extensions = {''}
end
if not device then
if os.getenv('windir') ~= nil then
device = 'windows'
elseif os.execute '[ -d "/Applications" ]' == 0 and os.execute '[ -d "/Library" ]' == 0 or os.execute '[ -d "/Applications" ]' == true and os.execute '[ -d "/Library" ]' == true then
device = 'mac'
else
device = 'linux'
end
end
function handleres(res, args)
if not res.error and res.status == 0 then
return res.stdout
else
msg.error("There was an error getting "..device.." clipboard: ")
msg.error(" Status: "..(res.status or ""))
msg.error(" Error: "..(res.error or ""))
msg.error(" stdout: "..(res.stdout or ""))
msg.error("args: "..utils.to_string(args))
return ''
end
end
function os.capture(cmd, raw)
local f = assert(io.popen(cmd, 'r'))
local s = assert(f:read('*a'))
f:close()
if raw then return s end
s = string.gsub(s, '^%s+', '')
s = string.gsub(s, '%s+$', '')
s = string.gsub(s, '[\n\r]+', ' ')
return s
end
local function get_extension(path)
match = string.match(path, '%.([^%.]+)$' )
if match == nil then
return 'nomatch'
else
return match
end
end
local function get_extentionpath(path)
match = string.match(path,'(.*)%.([^%.]+)$')
if match == nil then
return 'nomatch'
else
return match
end
end
local function has_extension (tab, val)
for index, value in ipairs(tab) do
if value == val then
return true
end
end
return false
end
local function starts_protocol (tab, val)
for index, value in ipairs(tab) do
if (val:find(value) == 1) then
return true
end
end
return false
end
function get_clipboard()
local clip
if device == 'linux' then
clip = os.capture(linux_paste, false)
return clip
elseif device == 'windows' then
if windows_paste == 'powershell' then
local args = {
'powershell', '-NoProfile', '-Command', [[& {
Trap {
Write-Error -ErrorRecord $_
Exit 1
}
$clip = Get-Clipboard -Raw -Format Text -TextFormatType UnicodeText
if ($clip) {
$clip = $clip
}
else {
$clip = Get-Clipboard -Raw -Format FileDropList
}
$u8clip = [System.Text.Encoding]::UTF8.GetBytes($clip)
[Console]::OpenStandardOutput().Write($u8clip, 0, $u8clip.Length)
}]]
}
return handleres(utils.subprocess({ args = args, cancellable = false }), args)
else
clip = os.capture(windows_paste, false)
return clip
end
elseif device == 'mac' then
clip = os.capture(mac_paste, false)
return clip
end
return ''
end
function set_clipboard(text)
local pipe
if device == 'linux' then
pipe = io.popen(linux_copy, 'w')
pipe:write(text)
pipe:close()
elseif device == 'windows' then
if windows_copy == 'powershell' then
local res = utils.subprocess({ args = {
'powershell', '-NoProfile', '-Command', string.format([[& {
Trap {
Write-Error -ErrorRecord $_
Exit 1
}
Add-Type -AssemblyName PresentationCore
[System.Windows.Clipboard]::SetText('%s')
}]], text)
} })
else
pipe = io.popen(windows_copy,'w')
pipe:write(text)
pipe:close()
end
elseif device == 'mac' then
pipe = io.popen(mac_copy,'w')
pipe:write(text)
pipe:close()
end
return ''
end
local function copy()
local filePath = mp.get_property_native('path')
if (filePath ~= nil) then
local time = math.floor(mp.get_property_number('time-pos'))
mp.osd_message("Copied:\n"..filePath..' |time='..tostring(time))
set_clipboard(filePath..' |time='..tostring(time))
else
mp.osd_message('Failed to Copy\nNo Video Found')
end
end
local function copy_path()
local filePath = mp.get_property_native('path')
if (filePath ~= nil) then
mp.osd_message("Copied Video Only:\n"..filePath)
set_clipboard(filePath)
else
return false
end
end
function paste()
mp.osd_message("Pasting...")
local clip = get_clipboard()
clip = string.gsub(clip, "[\r\n]" , "")
local filePath = mp.get_property_native('path')
local time
if string.match(clip, '(.*) |time=') then
videoFile = string.match(clip, '(.*) |time=')
time = string.match(clip, ' |time=(.*)')
elseif string.match(clip, '^\"(.*)\"$') then
videoFile = string.match(clip, '^\"(.*)\"$')
else
videoFile = clip
end
local currentVideoExtension = string.lower(get_extension(videoFile))
local currentVideoExtensionPath = (get_extentionpath(videoFile))
local seekTime
if (filePath == nil) and has_extension(extensions, currentVideoExtension) and (currentVideoExtensionPath~= '') then
mp.osd_message("Pasted:\n"..videoFile)
mp.commandv('loadfile', videoFile)
elseif (filePath == nil) and (starts_protocol(protocols, videoFile)) then
mp.osd_message("Pasted:\n"..videoFile)
mp.commandv('loadfile', videoFile)
elseif (filePath ~= nil) and (filePath ~= videoFile) and has_extension(extensions, currentVideoExtension) and (currentVideoExtensionPath~= '') or (starts_protocol(protocols, videoFile)) and (filePath ~= videoFile) then
mp.osd_message('Pasted Into Playlist:\n'..videoFile)
mp.commandv('loadfile', videoFile, 'append-play')
elseif (filePath == videoFile) and (time == nil) then
mp.osd_message('Same file is already running:\n'..clip)
elseif (filePath == videoFile) and (time ~= nil) then
mp.osd_message('Resumed to Copied Time')
seekTime = time + offset
if (seekTime < 0) then
seekTime = 0
end
mp.commandv('seek', seekTime, 'absolute', 'exact')
else
mp.osd_message('Failed to Paste\nPasted Unsupported Item:\n'..clip)
end
pasted = true
end
function paste_playlist()
mp.osd_message("Pasting...")
local clip = get_clipboard()
clip = string.gsub(clip, "[\r\n]" , "")
local filePath = mp.get_property_native('path')
if string.match(clip, '(.*) |time=') then
videoFile = string.match(clip, '(.*) |time=')
elseif string.match(clip, '^\"(.*)\"$') then
videoFile = string.match(clip, '^\"(.*)\"$')
else
videoFile = clip
end
local currentVideoExtension = string.lower(get_extension(videoFile))
local currentVideoExtensionPath = (get_extentionpath(videoFile))
if has_extension(extensions, currentVideoExtension) and (currentVideoExtensionPath~= '') or (starts_protocol(protocols, videoFile)) then
mp.osd_message('Pasted Into Playlist:\n'..videoFile)
mp.commandv('loadfile', videoFile, 'append-play')
else
mp.osd_message('Failed to Add Into Playlist\nPasted Unsupported Item:\n'..clip)
end
pasted = true
end
mp.register_event('end-file', function()
pasted = false
end)
mp.register_event('file-loaded', function()
if (pasted == true) then
local clip = get_clipboard()
local time = string.match(clip, ' |time=(.*)')
local videoFile = string.match(clip, '(.*) |time=')
local filePath = mp.get_property_native('path')
local seekTime
if (filePath == videoFile) and (time ~= nil) then
seekTime = time + offset
if (seekTime < 0) then
seekTime = 0
end
mp.commandv('seek', seekTime, 'absolute', 'exact')
end
else
return false
end
end)
---------------------------KEYBINDS CUSTOMIZATION SETTINGS---------------------------------
if device == 'mac' then --MAC OS Keybinds
mp.add_key_binding('Meta+alt+c', 'copy-path', copy_path)
mp.add_key_binding('Meta+alt+C', 'copy-pathCaps', copy_path)
mp.add_key_binding('Meta+alt+v', 'paste-playlist', paste_playlist)
mp.add_key_binding('Meta+alt+V', 'paste-playlistCaps', paste_playlist)
else --Windows and Linux Keybinds
mp.add_key_binding('ctrl+c', 'copy-path', copy_path)
mp.add_key_binding('ctrl+v', 'paste-playlist', paste_playlist)
end
---------------------END OF KEYBINDS CUSTOMIZATION SETTINGS---------------------------------

View File

@@ -0,0 +1,56 @@
---@class ClipshotOptions
---@field name string
---@field type string
local o = {
name = 'mpv-screenshot.jpeg',
type = '' -- defaults to jpeg
}
require('mp.options').read_options(o, 'clipshot')
local file, cmd
local lib = package.cpath:match('%p[\\|/]?%p(%a+)')
if lib == 'so' then -- Linux/BSD
file = '/tmp/'..o.name
if os.getenv('XDG_SESSION_TYPE') == 'wayland' then -- Wayland
cmd = {'sh', '-c', ('wl-copy < %q'):format(image)}
else -- Xorg
local type = o.type ~= '' and o.type or 'image/jpeg'
cmd = {'xclip', '-sel', 'c', '-t', type, '-i', file}
end
elseif lib == 'dll' then -- Windows
file = os.getenv('TEMP')..'\\'..o.name
cmd = {
'powershell', '-NoProfile', '-Command', ([[& {
Add-Type -Assembly System.Windows.Forms;
Add-Type -Assembly System.Drawing;
$shot = [Drawing.Image]::FromFile(%q);
[Windows.Forms.Clipboard]::SetImage($shot);
}]]):format(file)
}
else -- MacOS
file = os.getenv('TMPDIR')..'/'..o.name
-- png: «class PNGf»
local type = o.type ~= '' and o.type or 'JPEG picture'
cmd = {
'osascript', '-e', ([[
set the clipboard to ( ¬
read (POSIX file %q) as %s)
]]):format(file, type)
}
end
---@param arg string
---@return fun()
local function clipshot(arg)
return function()
mp.commandv('screenshot-to-file', file, arg)
mp.command_native_async({'run', unpack(cmd)}, function(suc, _, err)
mp.osd_message(suc and 'Copied screenshot to clipboard' or err, 1)
end)
end
end
mp.add_key_binding('c', 'clipshot-subs', clipshot('subtitles'))
mp.add_key_binding('C', 'clipshot-video', clipshot('video'))
mp.add_key_binding('Alt+c', 'clipshot-window', clipshot('window'))

View File

@@ -0,0 +1,418 @@
-- reload.lua
--
-- When an online video is stuck buffering or got very slow CDN
-- source, restarting often helps. This script provides automatic
-- reloading of videos that doesn't have buffering progress for some
-- time while keeping the current time position. It also adds `Ctrl+r`
-- keybinding to reload video manually.
--
-- SETTINGS
--
-- To override default setting put the `lua-settings/reload.conf` file in
-- mpv user folder, on linux it is `~/.config/mpv`. NOTE: config file
-- name should match the name of the script.
--
-- Default `reload.conf` settings:
--
-- ```
-- # enable automatic reload on timeout
-- # when paused-for-cache event fired, we will wait
-- # paused_for_cache_timer_timeout sedonds and then reload the video
-- paused_for_cache_timer_enabled=yes
--
-- # checking paused_for_cache property interval in seconds,
-- # can not be less than 0.05 (50 ms)
-- paused_for_cache_timer_interval=1
--
-- # time in seconds to wait until reload
-- paused_for_cache_timer_timeout=10
--
-- # enable automatic reload based on demuxer cache
-- # if demuxer-cache-time property didn't change in demuxer_cache_timer_timeout
-- # time interval, the video will be reloaded as soon as demuxer cache depleated
-- demuxer_cache_timer_enabled=yes
--
-- # checking demuxer-cache-time property interval in seconds,
-- # can not be less than 0.05 (50 ms)
-- demuxer_cache_timer_interval=2
--
-- # if demuxer cache didn't receive any data during demuxer_cache_timer_timeout
-- # we decide that it has no progress and will reload the stream when
-- # paused_for_cache event happens
-- demuxer_cache_timer_timeout=20
--
-- # when the end-of-file is reached, reload the stream to check
-- # if there is more content available.
-- reload_eof_enabled=no
--
-- # keybinding to reload stream from current time position
-- # you can disable keybinding by setting it to empty value
-- # reload_key_binding=
-- reload_key_binding=Ctrl+r
-- ```
--
-- DEBUGGING
--
-- Debug messages will be printed to stdout with mpv command line option
-- `--msg-level='reload=debug'`. You may also need to add the `--no-msg-color`
-- option to make the debug logs visible if you are using a dark colorscheme
-- in terminal.
local msg = require 'mp.msg'
local options = require 'mp.options'
local utils = require 'mp.utils'
local settings = {
paused_for_cache_timer_enabled = true,
paused_for_cache_timer_interval = 1,
paused_for_cache_timer_timeout = 10,
demuxer_cache_timer_enabled = true,
demuxer_cache_timer_interval = 2,
demuxer_cache_timer_timeout = 20,
reload_eof_enabled = false,
reload_key_binding = "Ctrl+r",
}
-- global state stores properties between reloads
local property_path = nil
local property_time_pos = 0
local property_keep_open = nil
-- FSM managing the demuxer cache.
--
-- States:
--
-- * fetch - fetching new data
-- * stale - unable to fetch new data for time < 'demuxer_cache_timer_timeout'
-- * stuck - unable to fetch new data for time >= 'demuxer_cache_timer_timeout'
--
-- State transitions:
--
-- +---------------------------+
-- v |
-- +-------+ +-------+ +-------+
-- + fetch +<--->+ stale +---->+ stuck |
-- +-------+ +-------+ +-------+
-- | ^ | ^ | ^
-- +---+ +---+ +---+
local demuxer_cache = {
timer = nil,
state = {
name = 'uninitialized',
demuxer_cache_time = 0,
in_state_time = 0,
},
events = {
continue_fetch = { name = 'continue_fetch', from = 'fetch', to = 'fetch' },
continue_stale = { name = 'continue_stale', from = 'stale', to = 'stale' },
continue_stuck = { name = 'continue_stuck', from = 'stuck', to = 'stuck' },
fetch_to_stale = { name = 'fetch_to_stale', from = 'fetch', to = 'stale' },
stale_to_fetch = { name = 'stale_to_fetch', from = 'stale', to = 'fetch' },
stale_to_stuck = { name = 'stale_to_stuck', from = 'stale', to = 'stuck' },
stuck_to_fetch = { name = 'stuck_to_fetch', from = 'stuck', to = 'fetch' },
},
}
-- Always start with 'fetch' state
function demuxer_cache.reset_state()
demuxer_cache.state = {
name = demuxer_cache.events.continue_fetch.to,
demuxer_cache_time = 0,
in_state_time = 0,
}
end
-- Has 'demuxer_cache_time' changed
function demuxer_cache.has_progress_since(t)
return demuxer_cache.state.demuxer_cache_time ~= t
end
function demuxer_cache.is_state_fetch()
return demuxer_cache.state.name == demuxer_cache.events.continue_fetch.to
end
function demuxer_cache.is_state_stale()
return demuxer_cache.state.name == demuxer_cache.events.continue_stale.to
end
function demuxer_cache.is_state_stuck()
return demuxer_cache.state.name == demuxer_cache.events.continue_stuck.to
end
function demuxer_cache.transition(event)
if demuxer_cache.state.name == event.from then
-- state setup
demuxer_cache.state.demuxer_cache_time = event.demuxer_cache_time
if event.name == 'continue_fetch' then
demuxer_cache.state.in_state_time = demuxer_cache.state.in_state_time + event.interval
elseif event.name == 'continue_stale' then
demuxer_cache.state.in_state_time = demuxer_cache.state.in_state_time + event.interval
elseif event.name == 'continue_stuck' then
demuxer_cache.state.in_state_time = demuxer_cache.state.in_state_time + event.interval
elseif event.name == 'fetch_to_stale' then
demuxer_cache.state.in_state_time = 0
elseif event.name == 'stale_to_fetch' then
demuxer_cache.state.in_state_time = 0
elseif event.name == 'stale_to_stuck' then
demuxer_cache.state.in_state_time = 0
elseif event.name == 'stuck_to_fetch' then
demuxer_cache.state.in_state_time = 0
end
-- state transition
demuxer_cache.state.name = event.to
msg.debug('demuxer_cache.transition', event.name, utils.to_string(demuxer_cache.state))
else
msg.error(
'demuxer_cache.transition',
'illegal transition', event.name,
'from state', demuxer_cache.state.name)
end
end
function demuxer_cache.initialize(demuxer_cache_timer_interval)
demuxer_cache.reset_state()
demuxer_cache.timer = mp.add_periodic_timer(
demuxer_cache_timer_interval,
function()
demuxer_cache.demuxer_cache_timer_tick(
mp.get_property_native('demuxer-cache-time'),
demuxer_cache_timer_interval)
end
)
end
-- If there is no progress of demuxer_cache_time in
-- settings.demuxer_cache_timer_timeout time interval switch state to
-- 'stuck' and switch back to 'fetch' as soon as any progress is made
function demuxer_cache.demuxer_cache_timer_tick(demuxer_cache_time, demuxer_cache_timer_interval)
local event = nil
local cache_has_progress = demuxer_cache.has_progress_since(demuxer_cache_time)
-- I miss pattern matching so much
if demuxer_cache.is_state_fetch() then
if cache_has_progress then
event = demuxer_cache.events.continue_fetch
else
event = demuxer_cache.events.fetch_to_stale
end
elseif demuxer_cache.is_state_stale() then
if cache_has_progress then
event = demuxer_cache.events.stale_to_fetch
elseif demuxer_cache.state.in_state_time < settings.demuxer_cache_timer_timeout then
event = demuxer_cache.events.continue_stale
else
event = demuxer_cache.events.stale_to_stuck
end
elseif demuxer_cache.is_state_stuck() then
if cache_has_progress then
event = demuxer_cache.events.stuck_to_fetch
else
event = demuxer_cache.events.continue_stuck
end
end
event.demuxer_cache_time = demuxer_cache_time
event.interval = demuxer_cache_timer_interval
demuxer_cache.transition(event)
end
local paused_for_cache = {
timer = nil,
time = 0,
}
function paused_for_cache.reset_timer()
msg.debug('paused_for_cache.reset_timer', paused_for_cache.time)
if paused_for_cache.timer then
paused_for_cache.timer:kill()
paused_for_cache.timer = nil
paused_for_cache.time = 0
end
end
function paused_for_cache.start_timer(interval_seconds, timeout_seconds)
msg.debug('paused_for_cache.start_timer', paused_for_cache.time)
if not paused_for_cache.timer then
paused_for_cache.timer = mp.add_periodic_timer(
interval_seconds,
function()
paused_for_cache.time = paused_for_cache.time + interval_seconds
if paused_for_cache.time >= timeout_seconds then
paused_for_cache.reset_timer()
reload_resume()
end
msg.debug('paused_for_cache', 'tick', paused_for_cache.time)
end
)
end
end
function paused_for_cache.handler(property, is_paused)
if is_paused then
if demuxer_cache.is_state_stuck() then
msg.info("demuxer cache has no progress")
-- reset demuxer state to avoid immediate reload if
-- paused_for_cache event triggered right after reload
demuxer_cache.reset_state()
reload_resume()
end
paused_for_cache.start_timer(
settings.paused_for_cache_timer_interval,
settings.paused_for_cache_timer_timeout)
else
paused_for_cache.reset_timer()
end
end
function read_settings()
options.read_options(settings, mp.get_script_name())
msg.debug(utils.to_string(settings))
end
function reload(path, time_pos)
msg.debug("reload", path, time_pos)
if time_pos == nil then
mp.commandv("loadfile", path, "replace")
else
mp.commandv("loadfile", path, "replace", "start=+" .. time_pos)
end
end
function reload_resume()
local path = mp.get_property("path", property_path)
local time_pos = mp.get_property("time-pos")
local reload_duration = mp.get_property_native("duration")
local playlist_count = mp.get_property_number("playlist/count")
local playlist_pos = mp.get_property_number("playlist-pos")
local playlist = {}
for i = 0, playlist_count-1 do
playlist[i] = mp.get_property("playlist/" .. i .. "/filename")
end
-- Tries to determine live stream vs. pre-recordered VOD. VOD has non-zero
-- duration property. When reloading VOD, to keep the current time position
-- we should provide offset from the start. Stream doesn't have fixed start.
-- Decent choice would be to reload stream from it's current 'live' positon.
-- That's the reason we don't pass the offset when reloading streams.
if reload_duration and reload_duration > 0 then
msg.info("reloading video from", time_pos, "second")
reload(path, time_pos)
-- VODs get stuck when reload is called without a time_pos
-- this is most noticeable in youtube videos whenever download gets stuck in the first frames
-- video would stay paused without being actually paused
-- issue surfaced in mpv 0.33, afaik
elseif reload_duration and reload_duration == 0 then
msg.info("reloading video from", time_pos, "second")
reload(path, time_pos)
else
msg.info("reloading stream")
reload(path, nil)
end
msg.info("file ", playlist_pos+1, "of", playlist_count, "in playlist")
for i = 0, playlist_pos-1 do
mp.commandv("loadfile", playlist[i], "append")
end
mp.commandv("playlist-move", 0, playlist_pos+1)
for i = playlist_pos+1, playlist_count-1 do
mp.commandv("loadfile", playlist[i], "append")
end
end
function reload_eof(property, eof_reached)
msg.debug("reload_eof", property, eof_reached)
local time_pos = mp.get_property_number("time-pos")
local duration = mp.get_property_number("duration")
if eof_reached and math.floor(time_pos) == math.floor(duration) then
msg.debug("property_time_pos", property_time_pos, "time_pos", time_pos)
-- Check that playback time_pos made progress after the last reload. When
-- eof is reached we try to reload video, in case there is more content
-- available. If time_pos stayed the same after reload, it means that vidkk
-- to avoid infinite reload loop when playback ended
-- math.floor function rounds time_pos to a second, to avoid inane reloads
if math.floor(property_time_pos) == math.floor(time_pos) then
msg.info("eof reached, playback ended")
mp.set_property("keep-open", property_keep_open)
else
msg.info("eof reached, checking if more content available")
reload_resume()
mp.set_property_bool("pause", false)
property_time_pos = time_pos
end
end
end
function on_file_loaded(event)
local debug_info = {
event = event,
time_pos = mp.get_property("time-pos"),
stream_pos = mp.get_property("stream-pos"),
stream_end = mp.get_property("stream-end"),
duration = mp.get_property("duration"),
seekable = mp.get_property("seekable"),
pause = mp.get_property("pause"),
paused_for_cache = mp.get_property("paused-for-cache"),
cache_buffering_state = mp.get_property("cache-buffering-state"),
}
msg.debug("debug_info", utils.to_string(debug_info))
-- When the video is reloaded after being paused for cache, it won't start
-- playing again while all properties looks fine:
-- `pause=no`, `paused-for-cache=no` and `cache-buffering-state=100`.
-- As a workaround, we cycle through the paused state by sending two SPACE
-- keypresses.
-- What didn't work:
-- - Cycling through the `pause` property.
-- - Run the `playlist-play-index current` command.
mp.commandv("keypress", 'SPACE')
mp.commandv("keypress", 'SPACE')
end
-- main
read_settings()
if settings.reload_key_binding ~= "" then
mp.add_key_binding(settings.reload_key_binding, "reload_resume", reload_resume)
end
if settings.paused_for_cache_timer_enabled then
mp.observe_property("paused-for-cache", "bool", paused_for_cache.handler)
end
if settings.demuxer_cache_timer_enabled then
demuxer_cache.initialize(settings.demuxer_cache_timer_interval)
end
if settings.reload_eof_enabled then
-- vo-configured == video output created && its configuration went ok
mp.observe_property(
"vo-configured",
"bool",
function(name, vo_configured)
msg.debug(name, vo_configured)
if vo_configured then
property_path = mp.get_property("path")
property_keep_open = mp.get_property("keep-open")
mp.set_property("keep-open", "yes")
mp.set_property("keep-open-pause", "no")
end
end
)
mp.observe_property("eof-reached", "bool", reload_eof)
end
mp.register_event("file-loaded", on_file_loaded)

View File

@@ -0,0 +1,5 @@
if grep -q "Arch Linux" /etc/os-release
function bat --wraps=glow --description 'alias bat glow'
glow $argv
end
end

View File

@@ -0,0 +1,9 @@
if grep -q "Arch Linux" /etc/os-release
atuin init fish | source
end
if grep -q "Arch Linux" /etc/os-release
function cat --wraps=glow --description 'alias cat glow'
glow $argv
end
end

View File

@@ -0,0 +1,3 @@
function deployments
rpm-ostree status $argv
end

View File

@@ -0,0 +1,7 @@
function fish_greeting
fastfetch -c ~/.config/fastfetch/startup.jsonc
## atuin
if grep -q "Arch Linux" /etc/os-release
atuin init fish | source
end
end

View File

@@ -0,0 +1,4 @@
function m4a --description 'alias m4a yt-dlp -x --audio-format m4a'
yt-dlp -x --audio-format m4a $argv
end

View File

@@ -0,0 +1,3 @@
function pin-deployment
sudo ostree admin pin $argv
end

View File

@@ -0,0 +1,3 @@
function remove-deployment
sudo ostree admin undeploy $argv
end

View File

@@ -0,0 +1,3 @@
function unpin-deployment
sudo ostree admin pin -u $argv
end

View File

@@ -0,0 +1,5 @@
-N 5
--embed-thumbnail
--embed-metadata
--cookies-from-browser firefox
-o ~/Downloads/%(fulltitle)s.%(ext)s

View File

@@ -0,0 +1,7 @@
--ozone-platform-hint=auto
--enable-gpu-rasterization
--ignore-gpu-blocklist
--enable-zero-copy
--use-gl=angle
--use-angle=vulkan
--enable-features=Vulkan,DefaultANGLEVulkan,VulkanFromANGLE,VaapiVideoDecodeLinuxGL,VaapiIgnoreDriverChecks,VaapiVideoEncoder,VaapiVideoDecoder

View File

@@ -0,0 +1,221 @@
# Include any additional configuration file(s)
# [include] sections are processed in the order you write them
# Files in $CONFIG_DIR/topgrade.d/ are automatically included before this file
[include]
# paths = ["/etc/topgrade.toml"]
[misc]
# Run `sudo -v` to cache credentials at the start of the run
# This avoids a blocking password prompt in the middle of an unattended run
# (default: false)
# pre_sudo = false
# Sudo command to be used
# sudo_command = "sudo"
# Disable specific steps - same options as the command line flag
disable = ["system", "containers"]
# Ignore failures for these steps
# ignore_failures = ["toolbx", "distrobox"]
# List of remote machines with Topgrade installed on them
# remote_topgrades = ["toothless", "pi", "parnas"]
# Path to Topgrade executable on remote machines
# remote_topgrade_path = ".cargo/bin/topgrade"
# Arguments to pass to SSH when upgrading remote systems
# ssh_arguments = "-o ConnectTimeout=2"
# Arguments to pass tmux when pulling Repositories
# tmux_arguments = "-S /var/tmux.sock"
# Do not set the terminal title (default: true)
# set_title = true
# Display the time in step titles (default: true)
# display_time = true
# Don't ask for confirmations (no default value)
assume_yes = true
# Do not ask to retry failed steps (default: false)
# no_retry = true
# Run inside tmux (default: false)
# run_in_tmux = true
# Cleanup temporary or old files (default: false)
cleanup = true
# Send a notification for every step (default: false)
# notify_each_step = false
# Skip sending a notification at the end of a run (default: false)
# skip_notify = true
# The Bash-it branch to update (default: "stable")
# bashit_branch = "stable"
# Run specific steps - same options as the command line flag
# only = ["system", "emacs"]
# Whether to self update
#
# this will be ignored if the binary is built without self update support
#
# available also via setting the environment variable TOPGRADE_NO_SELF_UPGRADE)
# no_self_update = true
# Extra tracing filter directives
# These are prepended to the `--log-filter` argument
# See: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives
# log_filters = ["topgrade::command=debug", "warn"]
# Commands to run before anything
[pre_commands]
# "Emacs Snapshot" = "rm -rf ~/.emacs.d/elpa.bak && cp -rl ~/.emacs.d/elpa ~/.emacs.d/elpa.bak"
# Commands to run after anything
[post_commands]
# "Emacs Snapshot" = "rm -rf ~/.emacs.d/elpa.bak && cp -rl ~/.emacs.d/elpa ~/.emacs.d/elpa.bak"
# Custom commands
[commands]
# "Python Environment" = "~/dev/.env/bin/pip install -i https://pypi.python.org/simple -U --upgrade-strategy eager jupyter"
# "Custom command using interactive shell (unix)" = "-i vim_upgrade"
[python]
# enable_pip_review = true ###disabled by default
# enable_pip_review_local = true ###disabled by default
# enable_pipupgrade = true ###disabled by default
# pipupgrade_arguments = "-y -u --pip-path pip" ###disabled by default
[composer]
# self_update = true
[brew]
# For the BrewCask step
# If `Repo Cask Upgrade` exists, then use the `-a` option.
# Otherwise, use the `--greedy` option.
# greedy_cask = true
# For the BrewCask step
# If `Repo Cask Upgrade` does not exist, then use the `--greedy_latest` option.
# NOTE: the above entry `greedy_cask` contains this entry, though you can enable
# both of them, they won't clash with each other.
# greedy_latest = true
# For the BrewCask step
# If `Repo Cask Upgrade` does not exist, then use the `--greedy_latest` option.
# NOTE: the above entry `greedy_cask` contains this entry, though you can enable
# both of them, they won't clash with each other.
# greedy_latest = true
# For the BrewFormula step
# Execute `brew autoremove` after the step.
# autoremove = true
# For the BrewFormula step
# Upgrade formulae built from the HEAD branch; `brew upgrade --fetch-HEAD`
# fetch_head = true
[linux]
# Arch Package Manager to use.
# Allowed values:
# autodetect, aura, garuda_update, pacman, pamac, paru, pikaur, trizen, yay
# arch_package_manager = "pacman"
# Arguments to pass yay (or paru) when updating packages
# yay_arguments = "--nodevel"
# Arguments to pass dnf when updating packages
# dnf_arguments = "--refresh"
# aura_aur_arguments = "-kx"
# aura_pacman_arguments = ""
# garuda_update_arguments = ""
# show_arch_news = true
# trizen_arguments = "--devel"
# pikaur_arguments = ""
# pamac_arguments = "--no-devel"
# enable_tlmgr = true
# emerge_sync_flags = "-q"
# emerge_update_flags = "-uDNa --with-bdeps=y world"
# redhat_distro_sync = false
# suse_dup = false
# rpm_ostree = false
# nix_arguments = "--flake"
# nix_env_arguments = "--prebuilt-only"
# Extra Home Manager arguments
# home_manager_arguments = ["--flake", "file"]
[git]
# How many repos to pull at max in parallel
# max_concurrency = 5
# Additional git repositories to pull
repos = [
"$HOME/*/",
"$HOME/git/*/",
]
# Don't pull the predefined git repos
# pull_predefined = false
# Arguments to pass Git when pulling Repositories
# arguments = "--rebase --autostash"
[windows]
# Manually select Windows updates
# accept_all_updates = false
# open_remotes_in_new_terminal = true
# wsl_update_pre_release = true
# wsl_update_use_web_download = true
# Causes Topgrade to rename itself during the run to allow package managers
# to upgrade it. Use this only if you installed Topgrade by using a package
# manager such as Scoop or Cargo
# self_rename = true
[npm]
# Use sudo if the NPM directory isn't owned by the current user
# use_sudo = true
[yarn]
# Run `yarn global upgrade` with `sudo`
# use_sudo = true
[vim]
# For `vim-plug`, execute `PlugUpdate!` instead of `PlugUpdate`
# force_plug_update = true
[firmware]
# Offer to update firmware; if false just check for and display available updates
upgrade = false
[vagrant]
# Vagrant directories
# directories = []
# power on vagrant boxes if needed
# power_on = true
# Always suspend vagrant boxes instead of powering off
# always_suspend = true
[flatpak]
# Use sudo for updating the system-wide installation
# use_sudo = true
[distrobox]
use_root = false
# containers = ["archlinux-latest"]
[containers]
# Specify the containers to ignore while updating (Wildcard supported)
# ignored_containers = ["ghcr.io/rancher-sandbox/rancher-desktop/rdx-proxy:latest", "docker.io*"]
[lensfun]
# If disabled, Topgrade invokes `lensfunupdatedata` without root priviledge,
# then the update will be only available to you. Otherwise, `sudo` is required,
# and the update will be installed system-wide, i.e., available to all users.
# (default: false)
# use_sudo = false

View File

@@ -0,0 +1,3 @@
#!/usr/bin/env bash
/usr/bin/just --justfile /usr/share/appends/00-master.just "${@}"

View File

@@ -0,0 +1,10 @@
#!/bin/bash
# Check if any arguments were passed to the script
if [ "$#" -gt 0 ]; then
# If arguments are passed, include them in the flatpak run command
flatpak run net.kuribo64.melonDS "$@"
else
# If no arguments are passed, just run the flatpak without any file
flatpak run net.kuribo64.melonDS
fi

View File

@@ -0,0 +1,19 @@
#!/usr/bin/env bash
IGNORE_MANUAL="wheel|root|sudo|nobody"
for manually_created_user in $(grep -E -e ".*:[1-3][[:digit:]]{3}:.*" "$1") ; do
# `grep` matched on a group with GID [1-3]000 or so
if [ ! -z "$(cut -f4 -d: <<< "${manually_created_user}")" ] ; then
continue
fi
IGNORE_MANUAL="$(cut -f1,3 -d: --output-delimiter="|" <<< "${manually_created_user}")|${IGNORE_MANUAL:-}"
for related_group in $(grep "$(cut -f1 -d: <<< ${manually_created_user})" "$1"); do
# Deduplicates matches for the same group/user
if [ "$(cut -f1 <<< "${related_group}")" == "$(cut -f1 <<< "${manually_created_user}")" ] ; then
continue
fi
IGNORE_MANUAL="$(cut -f1 -d: <<< "${related_group}")|${IGNORE_MANUAL:-}"
done
done
grep --no-filename -e "^g" /usr/lib/sysusers.d/*.conf | grep -v -E -e "${IGNORE_MANUAL}" | tr -s " " | cut -d" " -f2 | uniq | xargs -I{} sed -i "/{}/d" "${1}"

View File

@@ -0,0 +1,10 @@
#!/bin/bash
# Check if any arguments were passed to the script
if [ "$#" -gt 0 ]; then
# If arguments are passed, include them in the flatpak run command
flatpak run io.github.ryubing.Ryujinx "$@"
else
# If no arguments are passed, just run the flatpak without any file
flatpak run io.github.ryubing.Ryujinx
fi

View File

@@ -0,0 +1,27 @@
#!/bin/sh
export XDG_RUNTIME_DIR=/run/user/$(id -u)
if [ -z "$DBUS_SESSION_BUS_ADDRESS" ]; then
eval $(dbus-launch --sh-syntax)
fi
mutter --wayland &
MUTTER_PID=$!
sleep 5
export DISPLAY=:1
# Start Waydroid in the background
waydroid show-full-ui &
WAYDROID_PID=$!
# Wait for Waydroid exit event in the log
tail -f -n0 /var/lib/waydroid/waydroid.log | grep -m1 run_buffer
# Cleanup and logout
kill $WAYDROID_PID
kill $MUTTER_PID
# Use loginctl to end the session gracefully
loginctl terminate-session "$XDG_SESSION_ID"
exit 0

View File

@@ -0,0 +1,27 @@
#!/usr/bin/env bash
# Define directory & target filename
directory="$1"
filename="$2"
# Check if the filename already has .tar.zst; if not, append it
if [[ ! "$filename" =~ \.tar\.zst$ ]]; then
archive="$filename.tar.zst"
else
archive="$filename"
fi
# Make sure the directory exists
if [[ ! -d "$directory" ]]; then
echo "Directory '$directory' not found."
return 1
fi
# Create the archive with tar and pipe it to zstd
tar -cvf - "$directory" | zstd -9 -T0 -o "$archive"
# Check for errors during compression
if [[ $? -ne 0 ]]; then
echo "Error during compression."
return 1
fi

View File

@@ -0,0 +1,27 @@
# We have this script so that people using images with `nss-altfiles` (`/usr/lib/g{roup,shadow}`)
# do not break their systems when rebasing to an image without that
# This usually happens when using https://github.com/hhd-dev/rechunk then rebasing to an image without it.
# Please DO NOT remove this unless this is fully, completely obsolete.
# This is exactly what is making it break: https://github.com/ublue-os/legacy-rechunk/blob/1d2b0c2e99afbdc2eb06788ae28e157a88b03d70/1_prune.sh#L41-L47
# Users WILL experience black screens and systems will NOT boot if this script malfunctions. Please test this properly and always make sure this works
# Relevant issues:
# - https://github.com/bootc-dev/bootc/issues/1179#issuecomment-2708305926
# - https://github.com/ublue-os/main/issues/759
# - https://github.com/ublue-os/bluefin-lts/issues/918
# - https://github.com/ublue-os/image-template/issues/177
# - https://github.com/ublue-os/aurora/issues/1468
# - https://github.com/ublue-os/bluefin/issues/3852
# This got created on Tue, 16 Dec 2025 00:44:58 -0300
[Unit]
Description=Fix groups for Legacy rechunker
Wants=local-fs.target
After=local-fs.target
[Service]
Type=oneshot
ExecStart=rechunker-group-fix /etc/group
ExecStart=rechunker-group-fix /etc/gshadow
ExecStart=systemd-sysusers
[Install]
WantedBy=default.target multi-user.target

View File

@@ -0,0 +1,9 @@
[Unit]
Description=Topgrade update service
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
ExecCondition=/bin/bash -c '[[ "$(busctl get-property org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.NetworkManager Metered | cut -c 3-)" == @(2|4) ]]'
ExecStart=/usr/bin/topgrade --no-retry --cleanup --yes

View File

@@ -0,0 +1,11 @@
[Unit]
Description=Topgrade update service timer
[Timer]
RandomizedDelaySec=5m
OnBootSec=2m
OnUnitActiveSec=12h
Persistent=true
[Install]
WantedBy=timers.target

View File

@@ -0,0 +1 @@
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{serial}=="*vial:f64c2b3c*", MODE="0660", GROUP="users", TAG+="uaccess", TAG+="udev-acl"

Some files were not shown because too many files have changed in this diff Show More