Skip to content

[release] Ryoku 1.0.7 - #684

Merged
neur0map merged 82 commits into
mainfrom
release/1.0.7
Oct 31, 2026
Merged

neur0map merged 82 commits into
mainfrom
release/1.0.7

Conversation

@neur0map

Copy link
Copy Markdown
Member

Brings main up to unstable-dev for the 1.0.7 release. Every open issue and pull request was resolved on unstable-dev first; the only difference between the branches after this merge is the version line.

vampireJSV and others added 30 commits October 28, 2026 10:55
The Orpheus AI usage module counted every agent with a usage cache and
had no way to leave one out, while QS Bar's AI widget already has a
Tools picker.

- Modules > AI usage: one chip per supported agent (orpheus.aiTools,
  default all three). The module's figure, hover text and alert state
  only use the selected tools; none selected hides the module.
After switching to an empty workspace no toplevel is activated, so the
focusOrder === 0 fallback returned the last-focused window of the
workspace just left and the Orpheus window title kept showing it. The
fallback now requires the window to be on the workspace its output is
showing.
The avatar on a Users card and in the sidebar header was always the
first letter of the name, and nothing in the settings could change it.

- AvatarImage draws a person's picture in a circle: the AccountsService
  icon first, then ~/.face and ~/.face.icon; it reports hasImage so the
  caller keeps its letter when none loads.
- Hub > Global > Users: the card shows the picture; your own card has a
  PROFILE PICTURE row (CHOOSE / CHANGE / REMOVE). A pick is cropped to a
  512 px square into ~/.face and set through AccountsService SetIconFile,
  which needs no authorisation for your own account. Remove deletes both.
- Sidebar Controls header: the same picture for the signed-in user.
With Show empty on, the Orpheus workspace strip on a fixed-workspace
compositor always added one free slot after the last occupied workspace.
With four workspaces in use this drew a fifth that does not exist, and
there was no way to turn it off.

- Modules > Workspaces: new "Spare workspace at the end" switch, shown
  only while Show empty is on (orpheus.workspaceSpare, default on, so
  behavior is unchanged).
- Off: the strip ends at the last workspace that exists; gaps between
  existing workspaces still fill in.
The Apps catalogue drew the same oversized artwork cards as every other
category, so a page held a handful of apps and their icons read as
thumbnails. Apps now opens with a featured shelf, a Trending, Popular, New
and Updated strip, and compact icon and text tiles that fit several apps per
row; every other category keeps the artwork grid.

The strip needed data the provider never fetched, so the Flathub provider
now merges the popular, trending, recently added and recently updated
collections into one cached snapshot and passes the trending score, monthly
installs and update date through item metadata. A partial fetch still serves
the apps it got but does not replace the complete cache. Search keeps
Flathub's relevance order.

Note: New: the Apps catalogue is a marketplace page with sort tabs and compact tiles
Apps had its own page with a second ProductGrid, so the cover grid stayed
alive behind it and built a full set of artwork delegates for every app.
The hero and the sort strip now sit above the one grid, which switches to
compact tiles when Apps or the Flathub search is in scope, so the page
component, the surface alias and the overlay wrapper are gone.

Also drops the favourites count the provider fetched but nothing showed,
and folds the hero's three metadata labels into one chip component.
Apps listed one flat catalogue, so the only way to narrow it was the four
sort tabs. The market now carries a category row built from the Flathub
main category tags the provider already sends, with the count each one
holds, and a filter field that narrows the loaded catalogue as you type
and combines with the active tab.

The featured shelf steps aside while a category or a filter is active, so
a narrowed view is just the tabs, the sort row and the grid. An empty
result offers to clear the filter instead of leaving the market. The tab
row answers the wheel, and a hidden install-all button no longer reserves
width in any strip.

Note: New: browse Apps by category and filter the market in place
Replaced search process with runSearch function to handle image uploads and browser interactions.
Fedora moved hyprland-devel to 0.57: the renderer passes an explicit
CRenderContext, m_renderData is gone, and IPassElement's virtuals
changed, so the vendored plugin no longer compiled and the whole Fedora
publish stopped. Refresh the vendored bundle to upstream's current
commit (plus a Ryoku master that keeps the 0.56 source pins the Arch
lane resolves) and carry the 0.57 port as a Fedora fetch-hook patch, so
the Arch build keeps choosing the unchanged 0.56.2 source.

Verified: git bundle verify; git apply --check on the pinned commit;
libimgborders.so links in fedora:44 and fedora:45 containers with
hyprland-devel 0.57.0; the Arch resolver still maps 0.56.2 to the same
source commit.

Note: Fixed: the Fedora repository publish failed because the image-border plugin did not compile against Hyprland 0.57; Fedora now ships a ported build.
Main carries the release PR merge commits (#642, #643); unstable already
holds the same content as its own commits, so only the topology differs.
VERSION stays on the unstable line at 1.6.9.
Arch moved hyprland to 0.57 too: the no-pin fallback in the PKGBUILD
builds the bundle's default-branch HEAD, which still read m_renderData,
so the [ryoku] testing publish failed the same way Fedora's did. Move
master to the ported source (the Fedora fetch hook keeps checking out
the untouched upstream commit plus its patch), keeping the 0.56.2 pin
path byte-identical.

Verified: git bundle verify on the new master; makepkg in an
archlinux container resolves no pin for 0.57.0 and links
libimgborders.so; on this host (0.56.2) prepare still resolves the
68ec678 pin and builds.

Note: Fixed: the [ryoku] repository build failed against Hyprland 0.57 because the image-border plugin's fallback source predated the renderer change; the vendored HEAD now carries the port.
mkarchiso copies the airootfs with --no-preserve=mode, so the payload's
qylock bundle reaches the target with every file at 0644. The greeter
helper 1.0.6 added (sddm-host/install-greeter-theme) is executed
directly by install-qylock, so every Arch and CachyOS ISO install died
at the configure stage with "Permission denied" (exit 126). Restore its
bit next to the existing chmod of the two staged installers.

Verified: the shipped v1.0.6 CachyOS ISO fails exactly there in QEMU;
the same ISO with this backend overlaid installs (BACKEND_EXIT:0) and
boots the installed CachyOS kernel to the login prompt.

Note: Fixed: Arch and CachyOS ISO installs stopped at the sign-in screen setup with a Permission denied error; they now finish and boot.
modetest's -D takes a legacy bus id, not a device node, so
`modetest -D /dev/dri/cardN` never opened anything. probe_modes always
came back empty, the settle loop polled until its 6s deadline, and every
boot sat on a black screen before weston started on its preferred mode.
The per-output top-refresh config never applied.

Probe with -M <driver> (DRIVER= from the card's sysfs uevent) and keep
only connectors sysfs reports connected on the selected card, since -M
opens the first card bound to that driver. A probe that cannot open the
card at all now ends the poll at once and starts plain weston.

The tests asserted the broken -D argv against a stub; they now assert
-M, cover the sysfs filter, and fail if an unprobeable card waits for
the deadline.

Note: Fixed: The login screen no longer shows a black screen for about six seconds before it appears
ryoku-bluetooth-reset restarts bluetoothd at login and then restores the
saved radio state. For "on" the helper already waited for the controller,
but "off" ran `bluetoothctl power off` once, immediately. Right after the
restart the controller is still registering and BlueZ's AutoEnable is
powering it on, so the call fails with org.bluez.Error.Busy: the radio
comes up on against the user's choice and the reset unit fails.

Turning off now waits for a controller and retries until BlueZ reports
Powered: no, bounded like the on path. The test stub models a controller
that registers late and answers Busy once.

Note: Fixed: Bluetooth stays off after you log in when you had turned it off
system/packages/cachyos.replaces names what the CachyOS layer replaces
(the stock linux kernel, the AUR yay-bin). The ISO keeps them off by
seeding the provisioned ledger, but ryoku-shell-install's ledger only
records the user's deselected apps. On a box converted in place, the
manifest reconciler therefore read linux and yay-bin as "never
delivered" and installed them: `pacman -S --needed linux ...` next to
linux-cachyos, plus yay-bin in place of CachyOS's yay. Booting that stock
kernel can also miss what the CachyOS kernel carries for the hardware.

The manifest now carries cachyosReplaces, generated from the same file,
and FetchManifest hands a CachyOS host (os-release ID=cachyos) a manifest
whose base, dev, hardware and AUR lanes drop those names. The reconciler
and `ryoku verify` both read it that way, so the names are neither
installed nor reported as removed. Arch boxes and older manifests are
unchanged.

Note: Fixed: Updating a CachyOS install converted with the shell installer no longer adds the stock Arch kernel and yay-bin
The rail search had no keyboard navigation over its results and answered only
to Ctrl+K. Up/Down now walk the hits with wrap-around, Enter opens the
selected one instead of always the top hit, the header shows N / TOTAL, and
Ctrl+F is accepted alongside Ctrl+K as the focus shortcut.

The settings search answered only to Ctrl+K and had no way to move between
results by keyboard: Enter always opened the top hit, and only the pointer
could select a row.

- A `searchCursor` property now tracks which result is active under the
  keyboard. It resets to 0 on every edit and on dismissal, so refining a
  query or reopening the field never leaves a stale row selected.
- `Keys.onUpPressed` / `Keys.onDownPressed` on the search field walk the
  hits with wrap-around and scroll the list so the active row stays in view
  (`searchList.positionViewAtIndex(hub.searchCursor, ListView.Contain)`).
- `onAccepted` opens `hub.searchCursor` instead of always index 0.
- The delegate highlights `rr.index === hub.searchCursor`, and
  `MouseArea.onEntered` keeps the pointer and the keyboard cursor on the
  same row, so a click after a key press looks like a continuation rather
  than a jump.
- The header now shows `(cursor + 1) / TOTAL` next to the hit count.
- `Keys.onPressed` accepts `Ctrl+F` as well as `Ctrl+K`, the shortcut a
  user instinctively reaches for in a settings app.

ryoku

- Read the existing handler at `Hub.ml` 1079-1084 and the overlay at
  1752-1802 before editing; confirmed `Ctrl+F` was absent and that
  `onAccepted` hardcoded index 0.
- Verified every edit against the file after writing: the cursor property,
  the field handlers, the renamed `searchList` id, the delegate highlight,
  the `onEntered` sync, the header counter, the `Ctrl+F` key test, and the
  two reset sites all land where intended.
- `grep` confirms no em-dash in the three changed files.
- `.githooks/pre-commit` passes (rc=0). `qmllint` is not installed in this
  environment, so the QML was validated by inspection instead; run
  `qmllint ryoku/hub/quickshell/Hub.ml` on a dev box before merging.

- [x] One logical change, with a clear `[area] scope: summary` commit subject.
- [x] Matching `CHANGELOG.md` updated in the area I touched.
- [x] The git hooks pass locally; I did not use `--no-verify`.
- [x] QML parses where applicable. (`qmllint` is not installed here; verified
      by inspection and the pre-commit hook.)
- [x] No duplicated config, no dead code, no commented-out code, no em-dash.
- [x] Docs updated: `ryoku/hub/README.md` mentions `Ctrl+F` alongside
      `Ctrl+K`.

Note: New: Up/Down navigate the settings search results, Enter opens the
selected hit, and Ctrl+F focuses the search bar.
Use the Top layer for auto-hidden docks so app windows cannot cover their
hover strip. Keep pinned docks on Bottom and Stage editing on Overlay,
matching the existing ii dock fix.

Note: Fixed: Auto-hidden Ryoku docks open at the edge over app windows.
Note: Fixed: Fastfetch styles keep their renderer and theme roles after saving in Settings.
neur0map and others added 25 commits October 31, 2026 11:56
Stop making the compositor-neutral desktop require stock linux-headers.
Fresh Arch installs still pair stock linux with its headers, while CachyOS
replaces both with its two kernel and header pairs. Shell conversions and
ryoku doctor derive each installed kernel's pkgbase and install only the
matching <kernel>-headers package.

This keeps xpadneo and other DKMS modules buildable without putting headers
for an absent stock kernel on CachyOS boxes.

Note: Fixed: Arch and CachyOS boxes now receive headers only for their installed kernels
Note: Fixed: Skip matching kernel header packages that pacman cannot resolve so custom kernels do not break installation or doctor.
Read adapters through the live model and keep a shared BlueZ state reader so
the controls recover when the service or controller arrives after the shell.

Note: Fixed: Bluetooth controls follow the live adapter and powered state
Note: Fixed: The lock screen password field is ready after waking from sleep
Gate the separate visualizer surface on explicit overlay mode instead of the
inline hosts' asynchronously updated enabled state.

Note: Fixed: Desktop visualizers stay behind apps and the dock after toggles.
Note: Fixed: Orpheus workspace marks stay in workspace order.
Note: Fixed: Long Orpheus tray menus can be scrolled to their last row.
Note: Fixed: Opening an Orpheus card no longer flickers or reloads the bar.
Note: Fixed: Empty niri workspaces no longer keep the previous window title.
Note: Fixed: Profile pictures update immediately in Hub and sidebar.
Keep the single-flight install contract, but disable other products' actions
with a visible explanation while an operation is active.

Note: Fixed: other products no longer present inert download buttons during an install.
Order ordinary category pages by display name and keep a local search field
beside the list. Preserve marketplace rankings while exposing A to Z for Apps.

Note: New: category pages now have alphabetical ordering and scoped search.
Wait for the detail transition to finish before visual proof and give the Apps
sort controls and scoped search dedicated geometry at narrow widths.

Note: Fixed: compact app captures retain tile text and narrow controls no longer overlap.
Note: Fixed: Hyprland no longer draws its splash text at startup
The nightlight and watchdog tests ran a renamed copy or symlink of sleep as
their fake process. On uutils coreutils (the Ubuntu 26.04 runner image) sleep
is a multicall binary that dispatches on argv[0], so the fake exited at once
and both suites failed on CI while passing on GNU coreutils. The fakes are
now a shell script that sleeps under its own name and a shell blocked on a
pipe, which no coreutils flavour can change.
Note: Fixed: Login returns to the desktop when the cover graphics process stalls.
The inclusive-language gate lints every file a push changes, and the radio
singleton reached the release diff through the mpv change, so the word it
flags goes now rather than blocking the main merge.
Note: Fixed: Zsh installs now start with Ryoku's configured prompt.
Thirteen contributor pull requests and the fixes for every issue filed since
1.0.6: Hyprland 0.57 share picker and plugin setup, Fedora package conflicts,
removable mpv and kernel headers matching the installed kernels, the Orpheus
bar and QS Bar startup fixes, Bluetooth and lock screen state after resume,
the store marketplace, and the zsh login seed.
@neur0map
neur0map merged commit d678465 into main Oct 31, 2026
41 of 43 checks passed
neur0map added a commit that referenced this pull request Oct 31, 2026
Main carries the release PR merge commit (#684); unstable already holds the
same content as its own commits, so only the topology differs. VERSION stays
on the unstable line at 1.7.7.
@neur0map
neur0map deleted the release/1.0.7 branch October 31, 2026 16:53
neur0map added a commit that referenced this pull request Oct 31, 2026
Main carries the release PR merge commits (#684, #685); unstable already
holds the same content as its own commits, so only the topology differs.
VERSION stays on the unstable line at 1.7.8.
neur0map added a commit that referenced this pull request Oct 31, 2026
Main carries the release PR merge commits (#684, #685, #686); unstable
already holds the same content as its own commits, so only the topology
differs. VERSION stays on the unstable line at 1.8.0.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants