Skip to content

Omarchy 4 prep: Quickshell shell migration, menu selector compatibility, resume monitor, QML lint workflow#23

Draft
timmo001 wants to merge 1 commit into
distro/arch-omarchyfrom
omarchy-4-prep
Draft

Omarchy 4 prep: Quickshell shell migration, menu selector compatibility, resume monitor, QML lint workflow#23
timmo001 wants to merge 1 commit into
distro/arch-omarchyfrom
omarchy-4-prep

Conversation

@timmo001

@timmo001 timmo001 commented Jun 10, 2026

Copy link
Copy Markdown
Owner

Summary

Prepares and carries out the shell, bar, and Hyprland-config half of the Omarchy 4 migration: relocates the Home Assistant bar producer, adds reusable Quickshell bar-widget plugins, generates the per-host shell.json on stow, removes Waybar from the dot tooling, migrates the Hyprland config to Lua as a stowed package, and keeps menu selection, the resume monitor, and a QML lint workflow in place. The bar migration is VM-validated.

Supersedes #12 (closed) and the earlier #11. Sits on the current distro/arch-omarchy, which carries the dot MCP server and mcp-sync, the balanced-default power-profile tooling, host-scoped GPU env, and the shared lint CI; this branch adapts those recent hypr and power-profile changes to its Lua config and the Omarchy 4 menu selector, since the .conf -> .lua migration and the Walker drop would otherwise have lost or broken them.

Upstream baseline: basecamp/omarchy#5856 (the omarchy-shell branch), extension commit 1bb4394, default config config/omarchy/shell.json. If that PR advances, diff its new head against 1bb4394 before re-checking the items below.

Complete

Quickshell bar migration (VM-validated)

  • ha-bar-module relocated from the Waybar repo for Quickshell (parent detection, no WAYBAR_* env)
  • timmo.command and timmo.stream-command reusable bar-widget plugins (per-class colours, hide classes, click actions, IPC refresh, grey loading placeholder)
  • Per-host ~/.config/omarchy/shell.json auto-generated on dot stow (dot/src/lib/omarchyShellConfig.ts), built-ins mapped through, custom widgets instantiated with their command/clicks/colours
  • Custom modules routed through the timmo.* widgets rather than the built-in command module
  • Grey loading placeholder for the git modules plus on-resume IPC refresh; git watcher cache/lock reset preserved

Waybar removal

  • Waybar integration removed from dot (repo sync, doctor checks, git-diff cache) and remaining launch/cache leftovers cleaned up; the timmo001/omarchy-waybar repo is retained but no longer cloned

Shell-script and tooling compatibility

  • menu_select() helper in twitch-menu, workspace-menu, workspace-relayout, targeting Omarchy 4 only (Walker fallback dropped)
  • on-resume-monitor dbus sleep/wake monitor plus dot-on-resume-monitor.service, with a dot doctor check for script and unit presence/enablement
  • systemd doctor checks deduplicated behind a shared checkRequiredUserUnitSetup helper (no behaviour change)
  • tmux adopts Omarchy 4 keybindings, keeping the custom set-titles

Hyprland config migrated to Lua

  • Hyprland config moved into the dotfiles repo as a stowed package and rewritten from .conf to Lua (hyprland.lua, bindings.lua, envs.lua, input.lua, looknfeel.lua, monitors.lua, autostart.lua), with per-host overrides under hosts/<host>/ selected by the ~/.config/hypr/host symlink
  • Per-host monitor, input, and env configs (desktop DP-1 layout, laptop scale, Nvidia on desktop vs Intel iHD on laptop) and bind updates (1Password bind, envs loaded earlier, channel-based binds, SUPER+/ removed)
  • dot stow lays the Hypr package down non-destructively (--no-folding, skipping the usual unstow/restow) so the live hyprland.lua symlink never vanishes mid-stow and Hyprland's autoreload does not drop into emergency mode; dot init persists OMARCHY_HOST and enables the resume monitor
  • dot update reloads the running shell only when the generated shell.json changes, forcing QT_QPA_PLATFORM=wayland on the restart (interactive shells set wayland;xcb via zsh)

Omarchy 4 compatibility and carried base changes

  • power-profile-menu moved off the direct omarchy-launch-walker --dmenu path to omarchy-menu-select, matching the other Omarchy 4 menu scripts; the base added it against Walker, so it would not have worked here as-is
  • kbd-backlight-rearm now re-arms on resume through on-resume (host-guarded, a no-op off the laptop) instead of the laptop hypridle.conf the Lua migration removed; covers suspend/resume (not the idle-lock screen-wake path, which would need a host hypridle override this branch deliberately dropped)
  • GPU/VA-API env re-expressed in the host Lua config after the .conf -> .lua migration: global Nvidia dropped from envs.lua, scoped to the desktop host, with LIBVA_DRIVER_NAME=iHD on the laptop (the old global Nvidia env was wrong on the Intel laptop)
  • Power-profile bind (SUPER+CTRL+P -> power-profile-menu) and the laptop power-profile-daemon autostart carried into bindings.lua and the laptop autostart.lua
  • workspace-relayout's free-text layout-name prompt moved off the removed Walker (omarchy-launch-walker --inputonly) to the native omarchy-menu-input; the select-style menus already use omarchy-menu-select, so no script still depends on Walker
  • Restored the laptop-only dining-room temperature bar module (sensor.meter_plus_433c_temperature) dropped in the Waybar -> Quickshell migration, added as a second plain temperature entry in omarchyShellConfig.ts alongside the main one (the Waybar --gate-entity/--gate-below gating was not brought across)

Future rebase process

  • Fetch origin, inspect the new origin/distro/arch-omarchy commits first, and note base changes that overlap this PR before starting the rebase
  • Rebase this single-commit branch onto origin/distro/arch-omarchy, then read every conflict in context rather than taking one side mechanically
  • When base changes touch moved or deleted Omarchy 3 files, carry the useful behaviour into the Lua/Quickshell replacement instead of restoring stale .conf, Waybar, Walker, or hyprlock paths
  • Keep intentional deletions where Omarchy 4 owns the replacement, for example host hyprlock.conf/hypridle.conf removal, but only after checking whether the base added new behaviour that needs a Lua or shell-config equivalent
  • Regenerate generated docs/config references after conflict resolution, run the smallest relevant checks, and confirm there is no unrelated tool-lock drift from mise installs
  • Amend any rebase fixes and VM validation fixes back into the single prep commit, then force-push with lease so the PR remains one reviewable migration commit

CI and docs

  • .github/workflows/quickshell-lint.yml runs qmllint over all *.qml (module-dependent categories disabled so genuine syntax errors still fail)
  • Docs scrubbed of Waybar; migration plan trimmed to the remaining work

What's left

The Hyprland Lua migration and the shell/bar work are in this PR. What remains before it is fully done:

On-device VM validation

  • Hyprland starts from the Lua config; hyprctl reload succeeds; hyprctl configerrors is clean (or only understood upstream issues)
  • Desktop and laptop host selection stays correct
  • Resume recovery works without a hypridle after_sleep_cmd; lock, idle, screensaver, and wake behave through the Omarchy shell services
  • Network and Wi-Fi work with NetworkManager

Follow-ups

  • Move idle timing into shell.json once the Omarchy 4 shell idle service is active, then treat hypridle.conf/hyprlock.conf as Omarchy 3-only; confirm the laptop hyprsunset does not conflict with Omarchy 4 night light
  • The temperature/current-next-event icons are baked into ha-bar-module; they should move into bar config (Quickshell widget config here, Waybar format on the default branch)

Open decisions

  • Whether to keep this in dotfiles or eventually split it into a separate omarchy-quickshell repo (this PR consolidates the former dot-migration/ plan)
  • Git status modules: keep as shell command modules, or a small shared QML plugin with explicit refresh IPC
  • Home Assistant streaming modules: rewrite as one-shot polling commands, or a QML service plugin
  • Desktop vs laptop: one shared shell.json with host-specific scripts, or separate generated per-host configs

Validation

  • bash -n passes on all modified shell scripts, including the reworked power-profile-menu and on-resume
  • bunx tsc --noEmit, bun run build, and bun run format all passed before the latest rebase
  • qmllint (module-dependent categories disabled) passes on both QML widgets; an intentional syntax error was confirmed to fail
  • Bar VM-validated: plugins discovered, parsed values and colours render, hiding works, loading placeholder resolves, dot doctor clean
  • Post-rebase: the base's dot changes (MCP server/sync, notes tools, doctor checks, env.ts keys) merged into the Waybar-removal and shell wiring; env.ts, index.ts, spec.ts, and menu.ts verified to keep both sides. commands.md regenerated from the merged spec (now covers dot mcp / dot mcp-sync); a fresh mise run check / bun run build is still recommended

Reference: Quickshell extension model

Rules that inform the QML and plugin decisions
  1. ~/.config/omarchy/shell.json is canonical once it exists; it does not deep-merge with the default config.
  2. Built-in widget IDs use the reserved omarchy.* namespace; custom IDs use a separate namespace such as timmo.*.
  3. Command modules run on an interval and parse output after the command exits - suitable for polling, not long-running streams.
  4. Custom QML modules can live under ~/.config/omarchy/bar/modules/<id>.qml, or an entry can provide an explicit source path.
  5. Full plugins live under ~/.config/omarchy/plugins/<id>/manifest.json and can declare bar-widget, panel, overlay, menu, or service kinds.
  6. Plugins are unsandboxed code inside omarchy-shell, so custom QML should stay small and auditable.
  7. Waybar signal = RTMIN+N refresh does not map directly - use polling or shell IPC.
  8. Waybar CSS class semantics do not map directly - command modules use class/alt mainly for active styling.

@timmo001

Copy link
Copy Markdown
Owner Author

@copilot add a github workflow (based on the others in terms of formatting) to validate quickshell files. something like qmllint or similar could work here.

Put it in a dedicated workflow seperate from the dot build workflow, this will be dedicated to quickshell or qml (qt meta language)

Copilot AI commented Jun 10, 2026

Copy link
Copy Markdown

@copilot add a github workflow (based on the others in terms of formatting) to validate quickshell files. something like qmllint or similar could work here.

Put it in a dedicated wo...

Added a dedicated Lint Quickshell workflow (.github/workflows/quickshell-lint.yml) in fa0428e, formatted to match the existing workflows. It installs Qt 6's qmllint and runs it over all *.qml files. Since the Quickshell.* / qs.* modules aren't available in CI, the import/type/property/unqualified/signal categories are disabled so qmllint validates QML syntax and structure (real parse/syntax errors still fail the run). It triggers on *.qml changes (and the workflow file itself), separate from the dot build workflow.

Copilot AI changed the title Omarchy 4 prep: Quickshell shell migration, menu selector compatibility, resume monitor Omarchy 4 prep: Quickshell shell migration, menu selector compatibility, resume monitor, QML lint workflow Jun 10, 2026
@timmo001 timmo001 force-pushed the omarchy-4-prep branch 15 times, most recently from 9aca7ba to 9dd47f0 Compare June 14, 2026 22:27
@vercel

vercel Bot commented Jun 14, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
dotfiles Ready Ready Preview, Comment Jul 5, 2026 9:09pm

@timmo001 timmo001 force-pushed the omarchy-4-prep branch 2 times, most recently from d2a7c41 to b6f8823 Compare June 20, 2026 20:47
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.

2 participants