Skip to content

ryovm starts Ghostty with kitty's --class syntax, which Ghostty rejects #280

Closed

Description

@lothesito

Ryoku starts the terminal for ryovm/ryoport with exec "${TERMINAL:-kitty}" --class <name> -e ....
--class NAME with a space is kitty's form. Ghostty wants --class=NAME. With
Ghostty set as the terminal, every ryovm action opens Ghostty's config error
window and the class is never applied.

Versions

  • ryoku-desktop 0.75.3.r3968.gcfd8899-3
  • ghostty 1.3.1-2.2
  • Hyprland 0.56.2, CachyOS, kernel 7.2.x
  • Ryoku terminal setting: desktop.apps.terminal = ghostty

What appears

Ghostty's "Configuration Errors" window:

cli1:class: value required
cli2:ryoport-ssh: invalid field

Repro

ghostty --class ryoport-ssh -e sleep 20      dialog appears
ghostty --class=ryoport-ssh -e sleep 20      no dialog

Class the window ends up with, read back with hyprctl clients:

kitty   --class ryoport-ssh     ryoport-ssh
ghostty --class ryoport-ssh     com.mitchellh.ghostty, dialog shown
ghostty --class=ryoport-ssh     com.mitchellh.ghostty, logs "invalid 'class' in config, ignoring"

Two separate causes

  1. The flag form. Given --class NAME, Ghostty treats --class as a flag with no
    value and reports "class: value required", then parses NAME as another config
    field and reports "invalid field". That is what the window is showing.

  2. The names. Ghostty validates class as a GTK app id, and those cannot contain
    hyphens. ryoport-ssh, ryovm-ssh and ryoku-passkey are all rejected, so
    even with the right flag form the window keeps com.mitchellh.ghostty.

Window rules

window_rules.lua matches on those class names:

hl.window_rule({ name = "float-ryoport-ssh", match = { class = "ryoport-ssh" }, float = true, size = fit(900, 560), center = true })

With Ghostty the class never lands, so these windows are not floated or centred.
The rule cannot match. The dialog also has to be dismissed each time.

Call sites

  • ryoku/apps/ryovm/quickshell/Singletons/Remotes.qml:173 (ryoport-ssh, copy id)
  • ryoku/apps/ryovm/quickshell/Singletons/Remotes.qml:180 (ryoport-ssh, run on host)
  • ryoku/apps/ryovm/quickshell/Singletons/Vm.qml:781 (ryovm-ssh)
  • ryoku/apps/ryovm/quickshell/SettingsPanel.qml:187 (ryovm)
  • ryoku/hub/quickshell/pages/LockscreenPage.qml:326 (ryoku-passkey)

All five pass the class the same way.

Fixing it

The terminal is configurable, so the flag should be built for whichever one is
set instead of assuming kitty. Both parts above need handling: the flag form, and
names GTK will accept together with the matching window rules.

Ghostty and kitty are both installed here if a patch needs testing.

Activity

  1. changed the title [-]Machine page (GPU/MUX) raises Hyprland config errors: cli1:class: value required / cli2:ryovm: invalid field[/-] [+]ryovm starts Ghostty with kitty's --class syntax, which Ghostty rejects[/+] on Sep 26, 2026
  2. lothesito commented on Sep 27, 2026

    @lothesito
    Author

    Opened #281 with the flag form fixed on the five ${TERMINAL} launches. That removes the error window. The two items under "What this does not fix" in the PR (Ghostty missing from the terminalArgv switch in ryossh.go, and the hyphenated class names being invalid as GTK app ids) are still open, so this issue can stay up until those are decided.

  3. neur0map commented on Sep 27, 2026

    @neur0map
    Collaborator

    Thanks for the thorough writeup, both causes are sorted on unstable-dev: the launches now pass --class=NAME and the names are GTK-valid application ids (dev.ryoku.*), so Ghostty applies the class and the float rule matches again. ryossh's terminal switch also gained the Ghostty branch. Ships with the next release of main.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions