Skip to content

feat(keybind-cheatsheet): update to v0.2.2 data service architecture and bug fixes - #371

Draft
cheerfulScumbag wants to merge 3 commits into
noctalia-dev:mainfrom
cheerfulScumbag:update-keybind-cheatsheet-v0.2.2-final
Draft

feat(keybind-cheatsheet): update to v0.2.2 data service architecture and bug fixes#371
cheerfulScumbag wants to merge 3 commits into
noctalia-dev:mainfrom
cheerfulScumbag:update-keybind-cheatsheet-v0.2.2-final

Conversation

@cheerfulScumbag

Copy link
Copy Markdown
Contributor

Plugin

  • Id: kenn/keybind-cheatsheet
  • New plugin
  • Update to an existing plugin (version bumped in plugin.toml)

What it does

This update introduces a major architectural refactor to resolve host CPU callback timeouts and fixes reported community issues:

  1. Data Service Architecture (service.luau):

    • Offloads configuration parsing and cache ownership to a background service ([[service]] id = "data").
    • Panel opening (panel.luau) is now instant (0ms) and renders pre-parsed snapshots from memory without performing synchronous file I/O.
    • Eliminates polling timers, watchers, and panel-tick schedulers.
  2. Bug Fixes:

  3. Metadata & API:

    • Updated plugin_api = 9 for Noctalia v5 compatibility.

Note for @rylos: Once this v0.2.2 release is merged, PR #333 can rebase on top of this clean baseline to add your Niri 3x parsing speedup and 15s refresh timeout recovery!

External dependencies

  • hyprctl (used only for Hyprland Lua live bind queries)

Testing

  • Tested on Niri
  • Tested on Hyprland
  • Tested on Sway
  • Tested on another compositor:
  • Noctalia version tested against: v5.0.0
  • Plugin API level: 9

Screenshots / Videos

No visual changes to the UI surface. Rendered keybinding layout remains identical to v0.2.1.

Checklist

  • The directory name matches the part of id after the / in plugin.toml exactly.
  • It ships plugin.toml, README.md, thumbnail.webp, and translations/en.json.
  • README.md follows the
    README template, documents
    every entry id and dependency, and includes exact panel IPC commands and launcher prefixes where applicable.
  • I created thumbnail.webp with the thumbnail generator.
  • version follows semver and is bumped in this PR; plugin_api is the oldest API level this plugin requires.
  • Every non-English translation in this PR uses a locale supported by Noctalia core, and I can read, write, and
    understand that language well enough to review and maintain it (no unreviewed machine/LLM translations).
  • I did not edit catalog.toml; CI generates it.
  • This PR touches exactly one plugin directory.

Code review attestation

Plugins run as trusted, unsandboxed Luau in the user's session. Confirm:

  • The code is readable and not obfuscated, minified, or generated.
  • It does not download and execute remote code.
  • Every network call, filesystem write, and spawned process is something the description above accounts for.
  • I have the right to publish this code under the license declared in plugin.toml.

@rylos

rylos commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

Hi @cheerfulScumbag — thanks for picking this up so quickly, and for the kind
words on #333. I rebased my work on this branch locally to get ahead of the
merge, and while running your own fixture suite against it I hit a regression
that comes from this PR, not from mine. Reporting it before it lands.

hypr_lua fails the bundled self-test on this branch.

noctalia msg plugin kenn/keybind-cheatsheet:data all self-test
service.luau self-test
main (v0.2.1) passed: true
this branch (v0.2.2) passed: falsehypr_lua, missingCategory: "Workspaces"
this branch + my #333 same failure, inherited

The counts still match (4/4); the category is what goes missing.

Cause. For tests/fixtures/hypr/hyprland.lua:

Hyprland.config.bind("SUPER, " .. i, workspace, { description = "Workspace " .. i })

the rules produced by scanHyprLua differ:

main         prefix  "Workspace "   Workspaces
this branch  exact   "Workspace"    Workspaces

categoryFromHyprRules then compares "Workspace 1" against an exact rule
and falls through to Other. Two things combine to get there:

  1. local hasConcat = code:find("%.%.", 1, true) ~= nil or (rhs ~= nil and rhs:find("%.%.", 1, true) ~= nil)
    — with plain = true those searches look for the literal four-character
    string %.%., which never occurs, so hasConcat is always false and every
    description becomes exact. Either drop the true and keep the pattern
    (code:find("%.%."), as v0.2.1 did) or keep plain and search for "..".
  2. trim(str) on each extracted literal removes the trailing space that makes
    "Workspace " a useful prefix. Even with hasConcat fixed, the rule becomes
    prefix "Workspace", which happens to still match here but silently changes
    the meaning of every prefix rule.

Fixing (1) alone restores passed: true on my side.

On #333: my rebase onto this branch is ready and green apart from the above
— the niri parser changes are orthogonal to yours, and I folded your
single-quoted include support into the single-pass include scan so #268 keeps
working. Differential test says the bindings are identical to this branch on the
bundled fixtures, a 32 KB real config, and single/double-quoted includes. I will
push it to #333 as soon as this merges, bumped to v0.2.3.

@ItsLemmy
ItsLemmy marked this pull request as draft August 16, 2026 18:03
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.

[keybind-cheatsheet][BUG] Panel blank on Niri [keybind-cheatsheet][BUG] Keybinding category is ignored for binds with a multiline description

2 participants