The audit's second tier: values that were measurements of the author's desktop, shipped to every machine as if they were defaults. Settings greeted every human as Gabriel; it now greets whoever accountsservice says is signed in, and nobody when it says nothing. The weather shipped his home coordinates and confidently reported his forecast anywhere on earth; it now ships unset, fetches nothing until a location is chosen, and the location row says so. The GTK bookmarks carried seven /home/gib paths and his file server into every file dialog; they are now generated per machine from a template and gitignored -- Nautilus edits the instance freely, the way settings.ini already worked one file over. Web search routed through his personal bang redirector; the engine is now the webSearchUrl preference with a DuckDuckGo default, read by both the script command and the suggestions extension, which the launcher-search contract already pins to one another. The GPU vitals path defaulted to his card1 and lost the readout on any machine enumerated differently; a machine with exactly one GPU now adopts it. And the Containers and Snapshots pages hide once a scan proves their backing stack absent, instead of rendering permanently empty on machines that never had podman or snapper. Lesser residue swept in the same pass: the DP-2 hyprpaper block one machine needed, the author's username-typo expansions (moved to his personal seed in user/, where personal content belongs), a capture fallback into /home/gib, and a parity table asserting one machine's hardware as fact. Claude-Session: https://claude.ai/code/session_01Epx9ZC1gwm81K3jm9x9CKh
146 lines
9.3 KiB
Markdown
146 lines
9.3 KiB
Markdown
# Panama desktop parity
|
|
|
|
This is the living inventory for the GNOME-to-Hyprland transition. It records
|
|
real behavior, not a one-for-one count of extensions: an enabled extension with
|
|
no configured action is not treated as missing functionality.
|
|
|
|
Last live audit: 2026-08-17, Fedora 44, Hyprland 0.56.2, Quickshell 0.3.0.
|
|
|
|
## Daily desktop surfaces
|
|
|
|
| Capability | Panama implementation | Status |
|
|
|---|---|---|
|
|
| App launcher and run dialog | Vicinae; Wofi emergency fallback | Live |
|
|
| App grid | Vicinae applications provider | Live |
|
|
| Hidden applications | GNOME App Hider list in Vicinae provider config | Live |
|
|
| Tiling and dynamic workspaces | Hyprland Lua config, Forge keymap preserved | Live |
|
|
| Overview | Continuum filmstrip, large workspace preview, cross-workspace search | Live |
|
|
| Minimize | `SUPER+SHIFT+X` sends to scratchpad; `SUPER+X` restores | Live |
|
|
| Dock | Quickshell dock with GNOME favorites and intellihide | Live |
|
|
| Panel | Workspaces, CPU/RAM/GPU, clock, weather, quiet event capsule, media, clipboard, tray, status | Live |
|
|
| Clipboard history | Vicinae owns capture/storage; Quickshell provides the panel | Live |
|
|
| Notifications | Quickshell server, toasts, grouped history, DND, clear actions | Live |
|
|
| Date menu | Two-column Daybook with Agenda, Ongoing activity, Notifications, month calendar, weather, and media | Live |
|
|
| Ongoing activity | Focus, Caffeine, recording, screen sharing, camera, and microphone state with direct controls | Live |
|
|
| Calendar agenda | Existing GNOME, Google, iCloud, and Nextcloud sources through Evolution Data Server | Live |
|
|
| Control Center | Wi-Fi, Bluetooth, audio input/output, Caffeine, Night Light, Focus, Home Assistant favorites, and KDE Connect phone continuity | Live |
|
|
| Focus sessions | Persistent workspace-bound timer, DND/caffeine coordination, Signal Glass controls | Live |
|
|
| Brightness | Appears only when a backlight device exists | Live where the hardware exposes it |
|
|
| AppIndicator / tray | Native StatusNotifierItem host and themed menus | Live |
|
|
| Screenshot and recording | Quickshell picker, grim/slurp/satty/wf-recorder | Live |
|
|
| Screen text and code recognition | Local Tesseract/ZBar Read mode, selectable Prism result sheet | Live after package install |
|
|
| Lock, idle, and power | hyprlock, hypridle, login1, Quickshell power menu | Live |
|
|
| Wallpaper | hyprpaper | Live |
|
|
| Keyring and authorization | gnome-keyring and hyprpolkitagent | Live |
|
|
| Portals and screen sharing | xdg-desktop-portal-hyprland plus GTK portal | Live |
|
|
| Removable media | udiskie plus udisks notifications | Live |
|
|
| Autostart apps | Nextcloud, Bitwarden, and RustDesk system service/tray | Live |
|
|
| Printer administration | CUPS with the `system-config-printer` graphical interface | Live |
|
|
| System settings | The Settings app for display policy, appearance, desktop, sound, focus, shortcuts, and services; labeled GNOME hardware/account handoffs | Live |
|
|
| System health and recovery | Settings → System Health, `Check System Health` in Vicinae, a degraded-only bar indicator, redacted reports, and bounded Panama-owned repairs | Live |
|
|
|
|
## Portable machines
|
|
|
|
Panama was a desktop configuration until 2026-08-22, in the code as well as on
|
|
the machine: there was no reference to a battery, a lid, or a power source
|
|
anywhere in it, and `hypridle.conf` said "This is a desktop" in its own header.
|
|
|
|
| Capability | Panama implementation | Status |
|
|
|---|---|---|
|
|
| Battery level | `services/Battery.qml` reads sysfs the way Vitals reads procfs; bar indicator hides entirely without a battery | Live |
|
|
| Power source | `panama-hw ac`; a machine with no mains supply reports as on wall power, so a desktop is never treated as running out | Live |
|
|
| Charge threshold | Power page control, only where the firmware exposes a ceiling; written through `panama-sudo` | Live |
|
|
| Idle timings per power source | hypridle holds one set at a time, so `panama-idle` rebuilds its config when the charger comes or goes | Live |
|
|
| Lock on lid close | hypridle's `before_sleep_cmd` already locks, so a lid-close suspend is a locked suspend | Live |
|
|
| Clamshell / docked | A logind `handle-lid-switch` inhibitor held while an external display is connected. No lid watcher, and a failure returns logind's default | Live, untested on a lid |
|
|
| Display arrangement on reconnect | `Displays.plannedRestore()` reapplies a confirmed layout, refusing when the stored mode is not offered | Live |
|
|
| Charger and low-battery notices | `StatusEvents`; the charger is ambient so DND quiets it, critical battery is not | Live |
|
|
| Hardware predicates | `panama-hw`: laptop, battery, ac, lid-closed, external-monitor, clamshell, touchpad, nvidia | Live |
|
|
|
|
The clamshell path is the one row that has not run on hardware with a lid.
|
|
Everything testable about it is tested; the end-to-end behaviour of closing a
|
|
real lid on a docked machine is not, and the helper's header says so rather
|
|
than letting silence imply otherwise.
|
|
|
|
## System health and recovery
|
|
|
|
Panama stays silent while the desktop is healthy. A compact bar indicator
|
|
appears only for actionable warnings or errors and opens the same **System
|
|
Health** page available from Settings and the Vicinae command **Check
|
|
System Health**. The terminal summary is available with:
|
|
|
|
```bash
|
|
~/.config/quickshell/scripts/panama-doctor --summary
|
|
```
|
|
|
|
The doctor reports authored, redacted observations about Panama-owned services,
|
|
tools, links, and configured integrations. It does not read secrets, clipboard
|
|
or notification contents, calendar events, SSIDs, or device addresses. Repairs
|
|
are a small allow-list: Panama user services, Panama-owned links and launcher
|
|
commands, duplicate Panama Caffeine inhibitors, and a confirmed shell restart.
|
|
They never install packages, invoke `sudo`, delete user data, or rewrite
|
|
arbitrary configuration.
|
|
|
|
Generic Fedora configuration remains with the system tools that own it. The
|
|
final System Health card hands network settings, users, sharing, color
|
|
profiles, and digital wellbeing to their exact GNOME Settings panels rather
|
|
than presenting inert Hyprland controls.
|
|
|
|
## GNOME extension migration
|
|
|
|
| GNOME extension | Result |
|
|
|---|---|
|
|
| Forge | Replaced by Hyprland tiling and the original keymap |
|
|
| Dash to Dock | Replaced by the Quickshell dock |
|
|
| AppIndicator | Replaced by the Quickshell system tray |
|
|
| Clipboard Indicator | Replaced by the bar clipboard panel and Vicinae history |
|
|
| Emoji Copy | Replaced by Vicinae emoji search on `SUPER+.` |
|
|
| Vitals | Replaced by the CPU, memory, and GPU bar readouts |
|
|
| Weather O'Clock | Replaced by bar weather and the date-menu weather card |
|
|
| Caffeine | Replaced by a real logind inhibitor in quick settings |
|
|
| Blur My Shell / Openbar / User Theme | Replaced by the Prism shell and compositor blur |
|
|
| Bluetooth Quick Connect | Replaced by the full Bluetooth picker |
|
|
| Wi-Fi QR | Replaced by an on-demand QR-code sharing flow in Control Center's Wi-Fi panel; the code is generated only while shown and written to tmpfs, never persisted |
|
|
| GSConnect | Replaced by capability-aware KDE Connect phone continuity in Control Center; the paired iPhone exposes file, clipboard, and Ring actions when reachable |
|
|
| Home Assistant | Replaced by secure favorites in Control Center; explicit private environment values take precedence over the existing GNOME extension and Secret Service setup |
|
|
| Custom Hot Corners Extended | No action was configured, so there is no behavior to port |
|
|
| App Hider | Hidden app list is now applied in Vicinae |
|
|
| Allow Locked Remote Desktop | Mutter-specific patch; RustDesk is independent, but lock-screen access needs a real remote test |
|
|
|
|
## System UI still worth adding
|
|
|
|
These are not blockers for normal use, but they are the remaining places where
|
|
a polished general-purpose desktop can go beyond the current shell.
|
|
|
|
1. A real external RustDesk test while hyprlock is active. Local process state
|
|
cannot prove what a remote client sees or whether input is accepted.
|
|
2. Closing a real lid on a docked laptop. The inhibitor, the predicates and the
|
|
decision are all tested; the physical gesture is not.
|
|
3. A keyboard-layout change notice. Hyprland reports the active keymap but not
|
|
a change event Quickshell already consumes, so this needs either polling or
|
|
new event plumbing, and a single-layout machine cannot test it.
|
|
4. Sticky keys, slow keys and bounce keys. AccessX is an X11 server feature
|
|
with no Wayland equivalent; GNOME, macOS and Windows all ship these.
|
|
5. An on-screen keyboard, for a touch or convertible machine.
|
|
|
|
KDE Connect, the printer UI, Tesseract, and ZBar are installed and remain
|
|
tracked in `setup/packages/hyprland-packages`.
|
|
|
|
## Global menu decision
|
|
|
|
A macOS-style global application menu is not being shipped. Quickshell can
|
|
render a `DBusMenu` that an application already exports, but it does not provide
|
|
an application-menu registrar or a reliable focused-window-to-menu association.
|
|
Hyprland has no cross-toolkit global-menu protocol, and the daily applications
|
|
audited here do not consistently export one: GTK 4/Nautilus and Electron apps
|
|
are the important failures.
|
|
|
|
That would produce a premium-looking empty strip for most windows and a working
|
|
menu for a minority, which is worse than omitting it. Relevant references:
|
|
|
|
- <https://quickshell.org/docs/v0.3.0/types/Quickshell/DBusMenu/>
|
|
- <https://github.com/hyprwm/Hyprland/discussions/1358>
|
|
|
|
A future focused-window menu could expose compositor actions such as float,
|
|
move, fullscreen, and close. It should not be labeled as an application menu.
|