Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
104 commits
Select commit Hold shift + click to select a range
b867bfd
release: bump unstable to 1.4.1
github-actions[bot] Oct 26, 2026
97acd73
[release] version: continue unstable after 1.0.5
neur0map Oct 26, 2026
09255d7
[ryoku] performance: keep music visuals running
neur0map Oct 26, 2026
60310fa
release: bump unstable to 1.4.3
github-actions[bot] Oct 26, 2026
e5f7af1
[ryoku] audio: listen where the music actually plays
neur0map Oct 26, 2026
f12b3ec
release: bump unstable to 1.4.4
github-actions[bot] Oct 26, 2026
17767cf
[ryoku] niri: write whole proportions and opacities as floats
tattwamashi Oct 26, 2026
0dfcef2
[ryoku] hub: add an include-system switch to Update now
vampireJSV Oct 26, 2026
90400c7
[ryoku] ryostore: add an Apps category for Flathub applications
vampireJSV Oct 26, 2026
25ef6ff
[ryoku] shell daemon: report the live network device
Z3dan Oct 26, 2026
1d8ba0c
Merge pull request #583 from tattwamashi/fix/niri-float-proportions
neur0map Oct 26, 2026
2aa8c08
[ryoku] niri: log the float fix and validate whole values
neur0map Oct 26, 2026
7e8197c
Merge pull request #590 from Z3dan/fix/network-live-device
neur0map Oct 26, 2026
1956227
release: bump unstable to 1.4.5
github-actions[bot] Oct 26, 2026
faf0f10
Merge pull request #588 from vampireJSV/flatpak-store-provider
neur0map Oct 26, 2026
f8c99fd
[ryoku] ryostore: harden the Flathub provider
neur0map Oct 26, 2026
2a9f58f
release: bump unstable to 1.4.6
github-actions[bot] Oct 26, 2026
4715129
Merge pull request #585 from vampireJSV/hub-update-include-system
neur0map Oct 26, 2026
d3cba46
[ryoku] hub: make updates and bundles actionable
neur0map Oct 26, 2026
0fdab2b
release: bump unstable to 1.4.7
github-actions[bot] Oct 26, 2026
5186b65
[ryoku] osd: ignore app-driven microphone gain changes
neur0map Oct 26, 2026
8309830
[ryoku] wallpaper: tint shell during picker preview
neur0map Oct 26, 2026
82e41e1
[ryoku] controls: scroll clipped sidebar options
neur0map Oct 26, 2026
6e6a613
release: bump unstable to 1.4.8
github-actions[bot] Oct 26, 2026
174a267
[ryoku] visualizer: keep re-added looks visible on the desktop
neur0map Oct 26, 2026
5d3613b
release: bump unstable to 1.4.9
github-actions[bot] Oct 26, 2026
51281dd
[ryoku] shima: keep visualizer bars inside the widget card
neur0map Oct 26, 2026
1a1a5a5
[ryoku] lockscreen: put Orbital rings in front of the pill
neur0map Oct 26, 2026
1ba16d9
[ryoku] desktop: restore app placement and localize Shima menu
neur0map Oct 26, 2026
bdcd9ce
release: bump unstable to 1.5.0
github-actions[bot] Oct 26, 2026
d97b298
[ryoku] dock: restore pinned launches and normal stacking
neur0map Oct 26, 2026
b3b24e5
release: bump unstable to 1.5.1
github-actions[bot] Oct 26, 2026
764cb29
[test] rashin: cover agent exit during a running prompt
neur0map Oct 26, 2026
6ec93f1
release: bump unstable to 1.5.2
github-actions[bot] Oct 26, 2026
0ba6237
[system] lock: retire dead sessions and reuse live clients
neur0map Oct 26, 2026
26274db
release: bump unstable to 1.5.3
github-actions[bot] Oct 26, 2026
8ab6569
[ryoku] dock: show on empty workspaces when requested
neur0map Oct 26, 2026
c756cb0
release: bump unstable to 1.5.4
github-actions[bot] Oct 26, 2026
7658f69
[ryoku] hyprland: keep Game Mode blur off and spare tiled blur
neur0map Oct 26, 2026
6346968
release: bump unstable to 1.5.5
github-actions[bot] Oct 26, 2026
2e3bc1a
[ryoku] phone: select headers from installed kernels
neur0map Oct 26, 2026
90d5144
release: bump unstable to 1.5.6
github-actions[bot] Oct 26, 2026
47e51db
[ryoku] ryostore: refresh the store when a bundle install ends
Satirito Oct 26, 2026
dabaab8
Merge pull request #599 from Satirito/fix/ryostore-refresh-after-install
neur0map Oct 26, 2026
7f5eb49
[ryoku] ryostore: skip the extra reload after a stale rebuild
neur0map Oct 26, 2026
f29933d
release: bump unstable to 1.5.7
github-actions[bot] Oct 26, 2026
7f4bc15
[ryoku] desktop: keep plain visualizer above frosted content
neur0map Oct 26, 2026
76363b0
release: bump unstable to 1.5.8
github-actions[bot] Oct 26, 2026
f4d6460
[release] void: move the void-packages pin to PipeWire 1.6.10
neur0map Oct 26, 2026
cd51738
release: bump unstable to 1.5.9
github-actions[bot] Oct 26, 2026
7d45eed
[ryoku] shell: keep widget editor attached when switching displays
neur0map Oct 26, 2026
6eb4ea3
release: bump unstable to 1.6.0
github-actions[bot] Oct 26, 2026
5ca7fa9
[ryoku] confirmation: restyle desktop session actions
neur0map Oct 27, 2026
6a9554b
release: bump unstable to 1.6.1
github-actions[bot] Oct 27, 2026
e998c50
systemmonitor: do not open empty GPU power and fan paths
Oct 27, 2026
f040918
fastfetch: take the image branch in ghostty, not just kitty
ClimaxSteam Oct 27, 2026
d65ff05
Add customTint property to IconButton
Ronin-CK Oct 27, 2026
78c884e
Add phone connection properties and signal
Ronin-CK Oct 27, 2026
987a79b
Add shortcut for 'Send to phone' in ShortcutSheet.qml
Ronin-CK Oct 27, 2026
7cb19a3
Add phone connection handling and send function
Ronin-CK Oct 27, 2026
301dfd9
Add rectangle SVG path to Icon.qml
Ronin-CK Oct 27, 2026
be5e499
feat(hub): add toggle for Japanese glosses (kanji/kana) in UI
Oct 27, 2026
74deb73
[ryoku] shell: merge the empty sensor path guard (#605)
neur0map Oct 27, 2026
57f28ca
[ryoku] fastfetch: merge the ghostty logo branch (#608)
neur0map Oct 27, 2026
e1d8c45
[docs] changelog: credit the sensor guard and ghostty logo fixes
neur0map Oct 27, 2026
de93f48
[ryoku] shell: reap voice status followers
neur0map Oct 27, 2026
e8dee22
[ryoku] ryogami: keep picker controls ahead of event backlog
neur0map Oct 27, 2026
dc0fc0f
[ryoku] niri: keep shortcut recovery outside app grabs
neur0map Oct 27, 2026
3ca5c72
[system] bluetooth: recover radios hidden by rfkill
neur0map Oct 27, 2026
7d722ab
[ryoku] session: hold the boot cover through login
neur0map Oct 27, 2026
aba11b1
[ryoku] lockscreen: give every greeter skin a cursor and focus locks
neur0map Oct 27, 2026
2bc63b9
[ryoku] rashin: restore Hermes conversation history
neur0map Oct 27, 2026
7f4d7aa
[system] power: pin escalation to the packaged helper
neur0map Oct 27, 2026
30374d8
[ryoku] shell: keep Super+Escape controls warm between opens
neur0map Oct 27, 2026
a59288f
[ryoku] dock: paint island backgrounds at startup, reveal over windows
neur0map Oct 27, 2026
93976f1
[ryoku] shell: keep dock hover previews reachable from the bar
neur0map Oct 27, 2026
6a3dc10
[ryoku] visualizer: hear the music sink and react at quiet levels
neur0map Oct 27, 2026
d853828
[ryoku] visualizer: give each instance a stable identity
neur0map Oct 27, 2026
21a723e
[global] ryoshot: merge the KDE Connect send-to-phone action (#612)
neur0map Oct 27, 2026
5388bfe
[global] ryoshot: harden KDE Connect sharing
neur0map Oct 27, 2026
08ccc6d
[ryoku] shell: keep packaged QML stable during updates
neur0map Oct 27, 2026
2edf295
[ryoku] desktop: add app shortcuts and translate the folder menus
neur0map Oct 27, 2026
05c4755
[ryoku] hub: merge the Japanese glosses toggle (#619)
neur0map Oct 27, 2026
e7359b4
[ryoku] settings: apply the Japanese glosses switch everywhere
neur0map Oct 27, 2026
fc1905c
[ryoku] notifications: keep image toasts tall enough to show
neur0map Oct 27, 2026
823f044
[ryoku] shell: wire Python alerts and visualizer to host settings
neur0map Oct 27, 2026
67cbe1d
[ryoku] niri: stop held mute and play keys from toggling twice
neur0map Oct 27, 2026
55718f2
[release] xdph: ship the screencopy fixes on the stable Hyprland stack
neur0map Oct 27, 2026
26c97f1
release: bump unstable to 1.6.2
github-actions[bot] Oct 27, 2026
129af78
[installation] installer: test repo alignment without a pacman host
neur0map Oct 27, 2026
2193b1c
release: bump unstable to 1.6.3
github-actions[bot] Oct 27, 2026
5f2b8f9
[ryoku] lockscreen: follow the 12/24-hour choice on the sign-in screen
neur0map Oct 27, 2026
d913e97
[ryoku] launcher: keep the audio visualizer on the desktop
neur0map Oct 27, 2026
79b0dc1
[ryoku] dock: keep Shima and Python dock icons above the Shima chassis
neur0map Oct 27, 2026
ec66c4c
[ryoku] desktop: release the keyboard after creating shortcuts
neur0map Oct 27, 2026
98ab279
release: bump unstable to 1.6.4
github-actions[bot] Oct 28, 2026
152b18e
[ryoku] i18n: give Spanish its new desktop and Shima menu strings
neur0map Oct 28, 2026
ee6f45f
[ryoku] shima: keep one clock format so the lock follows Shima's clock
neur0map Oct 28, 2026
8ff409f
release: bump unstable to 1.6.5
github-actions[bot] Oct 28, 2026
1671d06
[system] pin the dns polkit grant to the installed helper path
neur0map Oct 28, 2026
88a951d
release: bump unstable to 1.6.6
github-actions[bot] Oct 28, 2026
f32344a
[docs] refresh the prowl project map in AGENTS.md
neur0map Oct 28, 2026
32aad69
release: bump unstable to 1.6.7
github-actions[bot] Oct 28, 2026
cad8ce3
[release] version: cut 1.0.6
neur0map Oct 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
10 changes: 5 additions & 5 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,11 +116,11 @@ there; the CLI needs no server and is the first choice.

Auto-generated from the Prowl index, refreshed on each `overview`/`init`. Prefer retrieving from Prowl (and reading the cited files) over grepping or relying on training memory; this is the current shape of the repo.

- size: 6256 files, 492641 symbols, 26729 edges (resolved 12811, external deps 7969, unresolved 5949)
- languages: qml:2468 go:2055 bash:577 javascript:305 json:255 markdown:141 cpp:112 python:75
- subsystems: ryoku/shell(2185,qml) · ryoku/shell(71,cpp) · ryoku/hub(66,qml) · ryoku/ui(59,qml) · ryoku/apps(57,qml) · ryoku/rashin(25,typescript) · tests/ui(21,qml) · ryoku/shell(18,css)
- entrypoints: ryoku/shell/quickshell/inir/modules/background/Background.qml · ryoku/shell/quickshell/shell/shell.qml · ryoku/shell/quickshell/shell/modules/dock/ii/settings/DockConfig.qml · ryoku/hub/quickshell/pages/InputPage.qml · ryoku/shell/quickshell/shell/modules/dock/ii/settings/DockUtilitiesConfig.qml · ryoku/shell/quickshell/stage/modules/ii/background/widgets/clock/WearOSArcClock.qml · ryoku/hub/quickshell/pages/AddonsPage.qml · ryoku/shell/quickshell/shell/modules/dock/ii/draw/LiveDrawWindow.qml · (+561 more)
- central files (most depended-on): ryoku/shell/quickshell/shell/modules/bar/barstyles/python/quickactions/actions/Timer.qml · ryoku/shell/quickshell/shell/modules/bar/barstyles/python/singletons/system/Config.qml · ryoku/shell/quickshell/shell/modules/bar/barstyles/python/singletons/system/I18n.qml · ryoku/ui/Singletons/Tokens.qml · ryoku/shell/quickshell/shell/modules/bar/barstyles/python/singletons/theme/ThemeBackend.qml
- size: 6773 files, 539735 symbols, 31135 edges (resolved 15835, external deps 8793, unresolved 6507)
- languages: qml:2775 go:2149 bash:616 javascript:317 json:271 markdown:149 cpp:123 python:100
- subsystems: ryoku/shell(2484,qml) · ryoku/hub(80,qml) · ryoku/shell(75,cpp) · ryoku/apps(58,qml) · ryoku/ui(56,qml) · ryoku/rashin(25,typescript) · tests/ui(22,qml) · ryoku/shell(20,css)
- entrypoints: ryoku/shell/quickshell/inir/modules/background/Background.qml · ryoku/shell/quickshell/shell/shell.qml · ryoku/shell/quickshell/stage/modules/ii/background/widgets/media/AndroidMediaWidget.qml · ryoku/shell/quickshell/shell/modules/bar/barstyles/python/media/MusicPopup.qml · ryoku/shell/quickshell/stage/modules/ii/background/widgets/clock/ConcentricClockWidget.qml · ryoku/hub/quickshell/pages/InputPage.qml · ryoku/shell/quickshell/shell/modules/bar/barstyles/python/syspanel/SystemPanel.qml · ryoku/shell/quickshell/stage/modules/ii/background/widgets/media/CircularMediaWidget.qml · (+742 more)
- central files (most depended-on): ryoku/shell/quickshell/shell/modules/bar/barstyles/python/quickactions/actions/Timer.qml · ryoku/ui/Singletons/Tokens.qml · ryoku/shell/quickshell/shell/modules/bar/barstyles/python/singletons/system/Config.qml · ryoku/shell/quickshell/shell/modules/bar/barstyles/python/singletons/system/I18n.qml · ryoku/shell/quickshell/shell/modules/bar/barstyles/python/singletons/theme/ThemeBackend.qml
- read these guides first: README.md · AGENTS.md · CONTRIBUTING.md · docs/development.md · docs/structure.md

Depth on demand: `prowl find|def|outline|references <name>`, `search <text>`, `context search "<question>"`, `sketch <ui>`.
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.0.5
1.0.6
33 changes: 33 additions & 0 deletions docs/store.md
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,7 @@ The public command surface is deliberately small:
```text
ryostore catalog [--refresh]
ryostore install <category> <id>
ryostore search <category> <query>
ryostore open <discover|library|category>
ryostore settings <category> [id]
```
Expand Down Expand Up @@ -287,6 +288,38 @@ and installation, not a second runtime copy.
the category offers Popular, New, and Verified orderings and global search.
Its thousands of preview and gallery URLs deliberately bypass eager asset
warming; only visible delegates request their remote media.
- **Apps (Flatpak):** list up to 300 of the most popular desktop applications
from the Flathub collection API, joined with `flatpak list`, so an installed
Flathub application outside that ranking is still listed and removable.
Flathub is a third-party source: it does not pass through the `ryostore`
registry or its screening. The detail labels Flathub's verified or
unverified state when known (or unknown for installed-only items) and warns
before installation; verification is not a Ryostore safety review. New apps
use the system Flatpak installation and its shared runtimes when its
`flathub` remote is valid; if only the user installation has a valid remote,
they install there instead. System installs may ask for authorization.
The store never adds a remote. When neither installation has a valid remote,
the app is unavailable; if the system remote is missing, `ryoku doctor` can
set it up. Before showing an installed app as a Flathub install, or installing
or updating it, the store checks that the selected installation's `flathub`
remote points at `https://dl.flathub.org/repo/`; a same-name remote elsewhere
is not trusted. Existing user-installed Flathub apps remain updateable and
removable there. If the same application exists in both installations, those
actions target the user copy. Removal refuses apps from other remotes, keeps
application data, and leaves unrelated runtimes alone.
An installed application with an update waiting (asked of each
installation that holds one, with `flatpak remote-ls --updates`, best effort
and bounded) shows UPDATE, which runs `flatpak update` in the installation
that holds it. The ranking is cached on disk and served flagged offline when
Flathub is unreachable. A search started from the Apps category also asks
Flathub's own search (`ryostore search flatpak <query>`, live, up to 30
results, queries of two characters or more, debounced in the UI), so an
application outside the ranking is still found; the catalogue's own copy
retains update state and matches a loose live result by ID.
Flathub matches loosely (typos, keywords, descriptions), so a result need not
contain the query text. Only Flathub CDN icons load lazily, like the Omarchy marketplace's
media. A host without the `flatpak` command lists the apps greyed out with the
reason.
- **Bundles:** fetch the `ryostore` bundle registry and join it with
`ryostore-install status`. Partial counts are first-class. Settings owns
installed bundle status and removal.
Expand Down
1 change: 1 addition & 0 deletions fedora/packages/rpm/ryoku-shell.spec
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ Requires: inotify-tools
Requires: easyeffects
Requires: lsp-plugins-lv2
Requires: lv2-calf-plugins
Suggests: kde-connect

%description
ryoku-shell, built from the shared Ryoku source and package payload recipe.
Expand Down
7 changes: 7 additions & 0 deletions fedora/packages/translations.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,12 @@ hyprgrass hyprgrass hyprland Ryoku-owned RPM.
hypridle hypridle desktop Provided by a restricted COPR.
hyprland hyprland hyprland Provided by a restricted COPR.
hyprland-preview-share-picker hyprland-preview-share-picker hyprland Ryoku-owned RPM.
hyprlang hyprlang hyprland Provided by a restricted COPR.
hyprpicker hyprpicker desktop Provided by a restricted COPR.
hyprpolkitagent hyprpolkitagent hyprland Provided by a restricted COPR.
hyprsunset hyprsunset hyprland Provided by a restricted COPR.
hyprtoolkit hyprtoolkit hyprland Provided by a restricted COPR.
hyprutils hyprutils hyprland Provided by a restricted COPR.
imagemagick ImageMagick desktop
imgborders imgborders hyprland Ryoku-owned RPM.
inetutils telnet optional
Expand Down Expand Up @@ -113,6 +116,7 @@ libnotify libnotify desktop
libpulse pulseaudio-libs pulseaudio-utils desktop
libqalculate libqalculate desktop
librsvg librsvg2-tools desktop
libstdc++ libstdc++ hyprland
libusb libusb1 optional
libva libva desktop
libvirt libvirt optional
Expand Down Expand Up @@ -219,6 +223,7 @@ ryoku-shell ryoku-shell desktop Ryoku-owned RPM.
ryomanager ryomanager optional Ryoku-owned RPM.
ryotunes ryotunes optional Ryoku-owned RPM.
scrcpy scrcpy optional Provided by a restricted COPR.
sdbus-cpp sdbus-cpp hyprland
sddm sddm desktop
shaderc glslc desktop
skwd-paper-bin skwd-paper-bin desktop Ryoku-owned RPM.
Expand Down Expand Up @@ -249,6 +254,7 @@ ttf-readex-pro ttf-readex-pro desktop Ryoku-owned RPM.
ttf-rubik-vf google-rubik-fonts desktop
udev systemd-udev desktop
upower upower desktop
util-linux-libs util-linux-libs hyprland
uv uv desktop
v4l2loopback-dkms v4l2loopback v4l2loopback-dkms optional Provided by a restricted COPR.
vdirsyncer vdirsyncer desktop
Expand All @@ -274,6 +280,7 @@ wlsunset wlsunset desktop
wpa_supplicant wpa_supplicant desktop
wtype wtype desktop
xcb-util-cursor xcb-util-cursor desktop
xdg-desktop-portal xdg-desktop-portal hyprland
xdg-desktop-portal-gnome xdg-desktop-portal-gnome desktop
xdg-desktop-portal-gtk xdg-desktop-portal-gtk desktop
xdg-desktop-portal-hyprland xdg-desktop-portal-hyprland hyprland Provided by a restricted COPR.
Expand Down
5 changes: 5 additions & 0 deletions installation/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,11 @@
(`installerplan/components.tsv`, `tui/main.go`, `backend/lib/deploy.sh`).

### Fixed
- **Fresh installs receive newer Ryoku package overrides.** After the Arch or
CachyOS desktop transaction, the installer aligns every installed package
that `[ryoku]` serves at a newer version. Both offline ISO repositories
compute and bake the same overrides instead of keeping an earlier
repository's build (`backend/lib/deploy.sh`, `iso/offline-repo.sh`).
- **The Void package check sees what a real install gets.** The Void container
image skips `/etc/skel` and other paths through noextract patterns, so the
clean-container install could not find the per-user services `ryoku-desktop`
Expand Down
34 changes: 34 additions & 0 deletions installation/backend/lib/deploy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,24 @@ ryoku_repo_keyring() {
run rm -f "$kd/ryoku.gpg" "$kd/ryoku-trusted" "$kd/ryoku-revoked"
}

# Print the installed packages for which [ryoku] serves a newer build. The
# qualified targets bypass pacman's first-repository rule without downgrading a
# package when an official or CachyOS repository has moved ahead.
ryoku_newer_repo_targets() {
local installed_out served_out repo name version comparison
local -A installed=()
installed_out=$(arch-chroot /mnt pacman -Q --noconfirm) || return
served_out=$(arch-chroot /mnt pacman -Sl --noconfirm ryoku) || return
while read -r name version _; do
[[ -n $name && -n $version ]] && installed["$name"]=$version
done <<<"$installed_out"
while read -r repo name version _; do
[[ $repo == ryoku && -n ${installed[$name]:-} ]] || continue
comparison=$(arch-chroot /mnt vercmp "$version" "${installed[$name]}") || return
(( comparison > 0 )) && printf 'ryoku/%s\n' "$name"
done <<<"$served_out"
}

# packages: pacman -S the desktop set from [ryoku] inside the chroot. The
# umbrella version-pins every monorepo component; hardware-only providers are
# added from the live machine's detector. Lends the live resolv.conf for DNS
Expand Down Expand Up @@ -159,6 +177,7 @@ ryoku_deploy_packages() {
else
log "DRYRUN: arch-chroot /mnt pacman -Sy --noprogressbar"
log "DRYRUN: arch-chroot /mnt pacman -S --noconfirm --needed --noprogressbar ${pkgs[*]} (one retry on a network flake)"
log "DRYRUN: after installation, align installed packages that [ryoku] serves at a newer version"
log "DRYRUN: would warn if $RYOKU_REPO/.payload version differs from pacman -Si ryoku-desktop"
fi
return 0
Expand Down Expand Up @@ -207,6 +226,21 @@ ryoku_deploy_packages() {
else
rc=1
fi
if (( rc == 0 )); then
case ${RYOKU_VARIANT:-} in
plain | cachyos)
local target_output
local -a align_targets=()
if ! target_output=$(ryoku_newer_repo_targets); then
rc=1
elif [[ -n $target_output ]]; then
mapfile -t align_targets <<<"$target_output"
log 'aligning newer [ryoku] package overrides: %s' "${align_targets[*]}"
arch-chroot /mnt pacman -S --noconfirm --needed --noprogressbar "${align_targets[@]}" || rc=$?
fi
;;
esac
fi

if (( made_resolv == 1 )); then
rm -f /mnt/etc/resolv.conf
Expand Down
55 changes: 49 additions & 6 deletions installation/iso/offline-repo.sh
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,11 @@ die() { printf 'offline-repo: error: %s\n' "$*" >&2; exit 1; }

command -v pacman >/dev/null 2>&1 || die "pacman not found"
command -v repo-add >/dev/null 2>&1 || die "repo-add not found (pacman package)"
case $VARIANT in
plain | cachyos) ;;
*) die "offline pacman closure supports only plain or cachyos, got: $VARIANT" ;;
esac


# read a plain one-per-line list, dropping comments + blanks.
read_list() { [[ -f $1 ]] && grep -vE '^[[:space:]]*(#|$)' "$1" || true; }
Expand Down Expand Up @@ -155,17 +160,19 @@ log "syncing repo databases (throwaway db)"
"${PAC[@]}" -Sy --config "$conf" --dbpath "$work/db" --noconfirm >/dev/null

# SERVED: every name the configured repos serve, mapped to the version pacman
# resolves it to: the first repo in config order that has the name, as on the
# target, whichever build is newer. RESOLVED keeps every "name version" pacman
# resolves it to: the first repo in config order that has the name, even when a
# later repo has a newer build. RESOLVED keeps every "name version" pacman
# resolved during this run, so a retry's db re-sync does not orphan what an
# earlier sync already fetched. Re-read after every db sync.
declare -A SERVED=() RESOLVED=()
declare -A SERVED=() SERVED_REPO=() RESOLVED=()
read_served() {
local _repo name ver
local repo name ver
SERVED=()
while read -r _repo name ver _; do
SERVED_REPO=()
while read -r repo name ver _; do
[[ -n ${SERVED[$name]:-} ]] && continue
SERVED[$name]=$ver
SERVED_REPO[$name]=$repo
RESOLVED["$name $ver"]=1
# A package file names its version without the epoch when the repo that
# publishes it does (ryotunes is 1:1.2.3-1 in a ryotunes-1.2.3-1 file), and
Expand All @@ -174,6 +181,20 @@ read_served() {
done < <("${PAC[@]}" -Sl --config "$conf" --dbpath "$work/db")
}
read_served
# Pacman resolves duplicate names from the first repository, regardless of
# version. Qualify every newer [ryoku] duplicate so the flat offline repository
# contains the same overrides `ryoku update` would select, without downgrades.
ryoku_pins=()
while read -r _repo name ver _; do
first_repo=${SERVED_REPO[$name]:-}
[[ -n $first_repo && $first_repo != ryoku ]] || continue
comparison=$(vercmp "$ver" "${SERVED[$name]}") || die "could not compare repository versions for $name"
(( comparison > 0 )) && ryoku_pins+=("$name")
done < <("${PAC[@]}" -Sl --config "$conf" --dbpath "$work/db" ryoku)
for name in "${ryoku_pins[@]}"; do
PKGS+=("ryoku/$name")
done
log "qualified ${#ryoku_pins[@]} newer [ryoku] duplicate(s) in the offline closure"

# An aur.packages name a configured repo serves (CachyOS ships zen-browser-bin)
# is that repo's package: fetch its build like any other, so the box updates it
Expand Down Expand Up @@ -505,7 +526,7 @@ done
# (a retry's re-sync, an older AUR build), `repo-add -p` indexes the newest
# whatever order it reads them in.
stage_offline_repo() {
local f base name
local f base name url candidate pinned
local -a keep=()
for f in "$CACHE"/*.pkg.tar.zst "$CACHE"/*.pkg.tar.xz; do
[[ -e $f ]] || continue
Expand All @@ -516,6 +537,28 @@ stage_offline_repo() {
done
(( ${#keep[@]} )) || die "no packages in $CACHE after download"
cp -a --reflink=auto "${keep[@]}" "$DEST"/

# The configured repo order is deliberately the installed system's order,
# where official/CachyOS repos precede [ryoku]. Resolve each override by its
# qualified target, then replace any earlier-repo build staged above.
for name in "${ryoku_pins[@]}"; do
pinned=
while IFS= read -r url; do
candidate=${url%%\?*}; candidate=${candidate##*/}
base=${candidate%.pkg.tar.*}; base=${base%-*}; base=${base%-*}; base=${base%-*}
if [[ $base == "$name" ]]; then
pinned="$CACHE/$candidate"
break
fi
done < <("${PAC[@]}" -Sp --config "$conf" --dbpath "$work/db" --print-format '%l' "ryoku/$name")
[[ -f $pinned ]] || die "qualified [ryoku] package '$name' was not downloaded"
for f in "$DEST/$name"-*.pkg.tar.*; do
[[ -e $f ]] || continue
base=${f##*/}; base=${base%.pkg.tar.*}; base=${base%-*}; base=${base%-*}; base=${base%-*}
[[ $base == "$name" ]] && rm -f "$f"
done
cp -a --reflink=auto "$pinned" "$DEST"/
done
}

# assemble the [offline] repo, then build the db.
Expand Down
3 changes: 3 additions & 0 deletions release/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,9 @@
the other plugin packages.

### Fixed
- **Hyprland screen sharing survives DMA-BUF renegotiation.** `[ryoku]` now
carries the post-1.4.1 portal fixes that preserve the capture callback and
bound PipeWire stream startup instead of wedging every later share.
- **Fedora applies Bluetooth tuning during the package transaction.** The
desktop RPM now restarts a running Bluetooth service after tuning BlueZ, as
the Arch, CachyOS, and Void package hooks already do.
Expand Down
4 changes: 4 additions & 0 deletions release/packages/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ repo. Packages publish only from `main` release tags, never from `unstable-dev`.
few commits past `v0.8.2` because that release regressed override-redirect
popup focus (Steam and Wine menus close on sight under niri). A pinned commit,
not a monorepo build; a later official `0.8.3` sorts above it and takes over.
- `xdg-desktop-portal-hyprland` -- the Hyprland portal pinned ten commits past
`v1.4.1`: it preserves the screencopy callback across DMA-BUF renegotiation
and bounds PipeWire stream startup instead of hanging forever. A later
official `1.4.2` sorts above it and takes over.
- `ryoku-desktop` -- the umbrella. Depends on the packages above plus the user-facing
desktop runtime, lays the base configuration under `/usr/share/ryoku/config`,
and installs the helper scripts (`ryoku-cmd-*`, the hardware `ryoku-*`,
Expand Down
2 changes: 2 additions & 0 deletions release/packages/ryoku-desktop-hyprland/PKGBUILD
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ depends=(
"ryoku-keysounds=$pkgver"
"hyprgrass=$pkgver"
'hyprpolkitagent'
# [ryoku] pins the post-1.4.1 DMA-BUF renegotiation and Start-timeout fixes;
# `ryoku update` repo-qualifies this drop-in even though extra is listed first.
'xdg-desktop-portal-hyprland'
# XDPH names /usr/bin/hyprland-preview-share-picker for the screen-share source
# chooser, so a hard depend keeps the picker atomic with the portal.
Expand Down
1 change: 1 addition & 0 deletions release/packages/ryoku-shell/PKGBUILD
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ license=('GPL-3.0-or-later')
# Python's built-in equalizer needs the processor and its LV2 effects at runtime.
depends=('quickshell' 'ffmpeg' 'wayland' 'jq' 'python' 'uv' 'socat' 'gum' 'qrencode' 'upower' 'brightnessctl' 'ddcutil' 'wtype' 'wl-clipboard' 'zenity' 'power-profiles-daemon' 'networkmanager' 'curl' 'libnotify' 'inotify-tools' 'easyeffects' 'lsp-plugins-lv2' 'calf')
makedepends=('go' 'wayland' 'wayland-protocols' 'ffmpeg')
optdepends=('kdeconnect: send ryoshot captures to paired devices')
source=()

_repo="$startdir/../../.."
Expand Down
Loading
Loading