From f2026055e17034e703f0c8fe012bb1b24f770fe8 Mon Sep 17 00:00:00 2001 From: Leandro Felix Date: Thu, 8 Oct 2026 20:23:48 -0300 Subject: [PATCH 1/4] plugins: add Session 0.2.2 --- plugins/power-button/.gitignore | 31 ++++ plugins/power-button/AGENTS.md | 84 ++++++++++ plugins/power-button/CLAUDE.md | 4 + plugins/power-button/LICENSE | 21 +++ plugins/power-button/README.md | 105 ++++++++++++ .../power-button/assets/preview-widget.png | Bin 0 -> 27366 bytes plugins/power-button/content/I18n.qml | 46 ++++++ plugins/power-button/content/Panel.qml | 154 ++++++++++++++++++ plugins/power-button/content/Widget.qml | 54 ++++++ plugins/power-button/manifest.json | 49 ++++++ plugins/power-button/product-manifest.json | 97 +++++++++++ plugins/power-button/service/Main.qml | 28 ++++ plugins/registry.json | 29 ++++ 13 files changed, 702 insertions(+) create mode 100644 plugins/power-button/.gitignore create mode 100644 plugins/power-button/AGENTS.md create mode 100644 plugins/power-button/CLAUDE.md create mode 100644 plugins/power-button/LICENSE create mode 100644 plugins/power-button/README.md create mode 100644 plugins/power-button/assets/preview-widget.png create mode 100644 plugins/power-button/content/I18n.qml create mode 100644 plugins/power-button/content/Panel.qml create mode 100644 plugins/power-button/content/Widget.qml create mode 100644 plugins/power-button/manifest.json create mode 100644 plugins/power-button/product-manifest.json create mode 100644 plugins/power-button/service/Main.qml diff --git a/plugins/power-button/.gitignore b/plugins/power-button/.gitignore new file mode 100644 index 0000000..ce56ced --- /dev/null +++ b/plugins/power-button/.gitignore @@ -0,0 +1,31 @@ +# OS / editor +.DS_Store +Thumbs.db +*.swp +*~ +.idea/ +.vscode/ +*.code-workspace + +# Logs / temp +*.log +*.tmp +*.bak +.cache/ + +# Secrets / local env (never commit) +.env +.env.* +!.env.example +*.pem +*.key +credentials.json +secrets.json +*_secret* +*_token* + +# Build / package artifacts +dist/ +build/ +*.qmlc +*.jsc diff --git a/plugins/power-button/AGENTS.md b/plugins/power-button/AGENTS.md new file mode 100644 index 0000000..0f53d86 --- /dev/null +++ b/plugins/power-button/AGENTS.md @@ -0,0 +1,84 @@ +# Agent guide for the power-button plugin + +This folder is a Ryoku shell plugin. If you are an AI agent editing it, follow +every rule below. They are the same rules `ryoku plugin validate` enforces, so +work that breaks one will not install. This file is self-contained: you do not +need any other document to work here. + +## The rules + +R1 Place. A plugin is one folder named after its id. Public / canonical source +is https://github.com/leandrofelix-dev/power-button ; local authoring clone is +`~/Work/power-button` (not the store install root). Never write into +`~/.local/share/ryoku/plugins/` (receipt-owned) or `~/.config/quickshell/` (the +shipped shell). + +R2 Shape. `manifest.json` at the root; `service/Main.qml` (logic, no UI); +`content/Widget.qml` (the one view); optional `content/Panel.qml` (a bar panel); +`README.md`; `LICENSE`; `assets/preview-widget.png` (a real capture); scripts +only under `bin/` with a shebang and the exec bit. Every extra file listed in +manifest `files`. + +R3 Id. Lowercase `[a-z0-9][a-z0-9-]*`, unique, not a built-in widget id. + +R4 Imports. Only `QtQuick*`, `Quickshell*`, `Ryoku.PluginKit`, +`Ryoku.PluginKit.Singletons`, and files inside the plugin folder. Never +`shell.*`, `Ryoku.Ui*` internals, or a relative import that climbs out of the +folder. + +R5 Settings. Declared in `metadata.settings` (types the bar renders: toggle, +choice, multi, int, text); read through `pluginApi.pluginSettings` behind a +default; written only through `pluginApi.saveSetting(key, value)`. Never edit +`shell.json` or `plugins.json` directly. + +R6 Commands. Every external program the plugin runs is either in its own `bin/` +or listed in `dependencies.commands`. No `sudo`, `doas`, `su`. A privileged +action is allowed only through `pkexec`, only on an explicit click, only when +listed in manifest `capabilities.privileged` (exact command strings) and +explained in README. + +R7 Network. Every host the plugin talks to is listed in +`capabilities.network`. No `curl … | sh`, no downloading and running code. + +R8 Files. Write only under `pluginApi.stateDir` +(`$XDG_STATE_HOME/ryoku/plugins/`), `$XDG_CACHE_HOME/ryoku/plugins/`, or +a temp dir. Never touch `~/.ssh`, `/etc`, shell rc files, or another plugin's +folder. + +R9 Shell. No `sh -c` with a string built from settings or program output +(injection). Pass argv arrays. + +R10 Secrets and binaries. No tokens, keys or credentials in the tree; no +compiled binaries (ELF/Mach-O/.so); scripts only. + +R11 Honesty. `official` is never true for a community plugin. `author` is +`Name `. README says what runs, what it reads, what it writes, and every +privileged/network capability. + +## The workflow + +1. `ryoku plugin new ` scaffolds this folder (already done). +2. Edit: `service/Main.qml` for logic, `content/Widget.qml` for the view, and + `content/Panel.qml` for the bar panel. Capture `assets/preview-widget.png`. +3. `ryoku plugin validate ` and fix every blocking finding (warnings are + advisory but read them). +4. `ryoku plugin add --bar --yes` to install it, then verify it on the bar + and under **QS Bar Settings > Community**. +5. `ryoku plugin share ` ONLY when the user asks to publish. Never share a + plugin unless asked. + +## What the host sets + +Every entry point receives, from the host: `pluginApi` (see below), `s` (a scale +factor), `active`, `density`, and `widthBudget`. Read them; never assign them. + +`pluginApi` exposes: + +- `mainInstance`: the live `service/Main.qml` instance every view shares. +- `pluginSettings`: the resolved settings object; read behind a default. +- `pluginDir`: this plugin's folder. +- `stateDir`: `$XDG_STATE_HOME/ryoku/plugins/`; the only place to write. +- `saveSetting(key, value)`: persist one setting. +- `panelOpen` (bool), `openPanel()`, `closePanel()`, `togglePanel()`: the bar + panel controls (present but inert off the bar). The sanctioned widget click is + `onClicked: pluginApi.togglePanel()`. diff --git a/plugins/power-button/CLAUDE.md b/plugins/power-button/CLAUDE.md new file mode 100644 index 0000000..3c35c32 --- /dev/null +++ b/plugins/power-button/CLAUDE.md @@ -0,0 +1,4 @@ +# CLAUDE.md + +Read `AGENTS.md` in this folder before editing anything here. +It holds every rule this plugin must follow and the full authoring workflow. diff --git a/plugins/power-button/LICENSE b/plugins/power-button/LICENSE new file mode 100644 index 0000000..de70bac --- /dev/null +++ b/plugins/power-button/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Felix + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/power-button/README.md b/plugins/power-button/README.md new file mode 100644 index 0000000..71acead --- /dev/null +++ b/plugins/power-button/README.md @@ -0,0 +1,105 @@ +# Session + +Session menu on the QS Bar: shut down, reboot, hibernate, or lock the screen. + +![Session menu open on the QS Bar](assets/preview-widget.png) + +## What it does + +- **Widget** — a power glyph on the QS Bar. A click only opens the session panel; + the glyph never runs an action by itself. +- **Panel** — Shut Down, Restart, Hibernate, Lock screen. Labels follow the + system locale (English source strings; Portuguese in `content/I18n.qml`). + Escape or click outside dismisses via the host `PluginPanel`. +- **Service** — on an explicit panel row tap, runs one of the declared commands + below, then closes the panel. + +No mutation ever happens on a bar-mark click. + +## Install + +From this repository on a Ryoku desktop: + +``` +ryoku plugin validate . +ryoku plugin add . --bar --yes +``` + +Or install from **Ryostore → Plugins** once it is listed. Enable and place it +under **QS Bar Settings → Community**. + +## How it plugs in + +The shell owns the bar host and the panel card. This plugin ships: + +- `service/Main.qml` — headless session actions (`systemctl` / `ryoku-shell`). +- `content/Widget.qml` — the bar glyph (`density: glyph`); click calls + `pluginApi.togglePanel()`. +- `content/Panel.qml` — the session list (`density: full`); rows call the + service, then `pluginApi.closePanel()`. +- `content/I18n.qml` — plugin-local translations (R4 forbids shell I18n). + +`hosts` is `topbarGlyph` only; `defaults.host` is `topbarGlyph`. + +## Settings + +None. `metadata.settings` is empty. + +## What it runs + +Every external command, and exactly when (only after a panel row tap): + +| Command | When | +| --- | --- | +| `systemctl poweroff` | Shut Down | +| `systemctl reboot` | Restart | +| `systemctl hibernate` | Hibernate | +| `ryoku-shell lock` | Lock screen (same path as Super+L / native quick settings) | + +## What it never does + +- No network access. +- No privileged escalation (`pkexec` / `sudo` / `doas` / `su`). +- No writes under the plugin state dir, cache, or elsewhere. +- No compositor-specific tools (`hyprctl`, etc.). + +## Requirements + +- A running Ryoku shell with `Ryoku.PluginKit`. +- `systemctl` and `ryoku-shell` on `PATH` (declared in `dependencies.commands`). + +## Source + +Canonical / public source: +[https://github.com/leandrofelix-dev/power-button](https://github.com/leandrofelix-dev/power-button) + +Local development clone (optional): `~/Work/power-button`. + +## Where it lists + +Community plugin (`official: false`). It appears under **QS Bar Settings > +Community** with the store's community warning, its author, and its switch. + +## Develop + +``` +power-button/ + manifest.json # id, version, hosts, entry points, files + service/Main.qml # main: session actions + content/Widget.qml # bar glyph + content/Panel.qml # session panel + content/I18n.qml # en / pt / pt_BR labels + assets/preview-widget.png # README / Store preview + LICENSE # MIT +``` + +## Maintenance & safety + +Session is a community contribution. Its author maintains and updates it — not +the Ryoku team. Ryostore screens submissions against the plugin rules, but +screening is a safeguard, not a guarantee: review what a plugin does before +enabling it. + +## Credits + +Felix \. MIT licensed. See [LICENSE](LICENSE). diff --git a/plugins/power-button/assets/preview-widget.png b/plugins/power-button/assets/preview-widget.png new file mode 100644 index 0000000000000000000000000000000000000000..4121d66542f216f5f3bea2c85de71fdf5b5bca9f GIT binary patch literal 27366 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 v&WB1lY71$4a*(}HwCVM|WUBt* 0 ? widthBudget : 300 + + implicitWidth: root.w + implicitHeight: col.implicitHeight + + I18n { + id: i18n + } + + function run(action) { + if (!root.service) + return; + if (action === "powerOff") + root.service.powerOff(); + else if (action === "reboot") + root.service.reboot(); + else if (action === "hibernate") + root.service.hibernate(); + else if (action === "lock") + root.service.lock(); + if (root.pluginApi) + root.pluginApi.closePanel(); + } + + // Full-width action row: GlyphIcon + label (native session glyphs). + component ActionRow: Rectangle { + id: row + property string label: "" + property string icon: "" + property bool danger: false + signal tapped() + + width: parent ? parent.width : 0 + implicitHeight: 34 * root.s + radius: 0 + color: rowHover.hovered + ? (row.danger ? Qt.rgba(Theme.sun.r, Theme.sun.g, Theme.sun.b, 0.14) : Theme.sheen) + : "transparent" + border.width: 1 + border.color: row.danger + ? (rowHover.hovered ? Theme.sun : Theme.lineStrong) + : (rowHover.hovered ? Theme.lineStrong : Theme.border) + Behavior on color { ColorAnimation { duration: 120 } } + Behavior on border.color { ColorAnimation { duration: 120 } } + + Row { + anchors.left: parent.left + anchors.leftMargin: 12 * root.s + anchors.verticalCenter: parent.verticalCenter + spacing: 10 * root.s + + GlyphIcon { + anchors.verticalCenter: parent.verticalCenter + width: 15 * root.s + height: 15 * root.s + name: row.icon + color: row.danger ? Theme.sun : (rowHover.hovered ? Theme.cream : Theme.iconDim) + stroke: 1.8 + Behavior on color { ColorAnimation { duration: 120 } } + } + + Text { + anchors.verticalCenter: parent.verticalCenter + text: row.label + color: row.danger ? Theme.sun : Theme.cream + font.family: Theme.mono + font.pixelSize: 11 * root.s + font.weight: Font.DemiBold + font.letterSpacing: 1.2 * root.s + } + } + + HoverHandler { + id: rowHover + cursorShape: Qt.PointingHandCursor + } + + TapHandler { + onTapped: row.tapped() + } + } + + Column { + id: col + width: root.w + spacing: 12 * root.s + + Text { + width: parent.width + text: i18n.tr("Session") + color: Theme.cream + font.family: Theme.mono + font.pixelSize: 13 * root.s + font.weight: Font.DemiBold + font.letterSpacing: 2.4 * root.s + font.capitalization: Font.AllUppercase + } + + Rectangle { + width: parent.width + height: 1 + color: Theme.hair + } + + Column { + width: parent.width + spacing: 6 * root.s + + ActionRow { + label: i18n.tr("Shut Down") + icon: "shutdown" + danger: true + onTapped: root.run("powerOff") + } + + ActionRow { + label: i18n.tr("Restart") + icon: "reboot" + onTapped: root.run("reboot") + } + + ActionRow { + // GlyphKit has no "hibernate"; "suspend" is the sleep/moon mark. + label: i18n.tr("Hibernate") + icon: "suspend" + onTapped: root.run("hibernate") + } + + ActionRow { + label: i18n.tr("Lock screen") + icon: "lock" + onTapped: root.run("lock") + } + } + } +} diff --git a/plugins/power-button/content/Widget.qml b/plugins/power-button/content/Widget.qml new file mode 100644 index 0000000..399d4d9 --- /dev/null +++ b/plugins/power-button/content/Widget.qml @@ -0,0 +1,54 @@ +pragma ComponentBehavior: Bound + +import QtQuick +import Ryoku.PluginKit +import Ryoku.PluginKit.Singletons + +// Bar glyph. Click opens the session menu panel (never runs an action directly). +Item { + id: root + + property var pluginApi + property var screen + property bool active: false + property string density: "glyph" + property real s: 1 + property real widthBudget: 0 + + readonly property bool panelOpen: pluginApi ? pluginApi.panelOpen : false + readonly property bool lit: root.panelOpen || hover.hovered + + implicitWidth: 22 * root.s + implicitHeight: 22 * root.s + + // Quiet hover plate — same dossier language as native pill glyphs. + Rectangle { + anchors.centerIn: parent + width: 20 * root.s + height: 20 * root.s + radius: 0 + color: root.lit ? Theme.sheen : "transparent" + border.width: root.panelOpen ? 1 : 0 + border.color: Theme.hair + Behavior on color { ColorAnimation { duration: 120 } } + } + + GlyphIcon { + anchors.centerIn: parent + width: 15 * root.s + height: 15 * root.s + name: "shutdown" + color: root.panelOpen ? Theme.accent : (hover.hovered ? Theme.cream : Theme.iconDim) + stroke: 1.8 + Behavior on color { ColorAnimation { duration: 120 } } + } + + HoverHandler { + id: hover + cursorShape: Qt.PointingHandCursor + } + + TapHandler { + onTapped: if (root.pluginApi) root.pluginApi.togglePanel() + } +} diff --git a/plugins/power-button/manifest.json b/plugins/power-button/manifest.json new file mode 100644 index 0000000..00ec891 --- /dev/null +++ b/plugins/power-button/manifest.json @@ -0,0 +1,49 @@ +{ + "id": "power-button", + "name": "Session", + "version": "0.2.2", + "author": "Felix ", + "description": "Session menu on the QS Bar: shut down, reboot, hibernate, or lock via ryoku-shell.", + "license": "MIT", + "official": false, + "tags": [ + "session", + "power", + "bar-widget" + ], + "hosts": [ + "topbarGlyph" + ], + "entryPoints": { + "main": "service/Main.qml", + "content": "content/Widget.qml", + "panel": "content/Panel.qml" + }, + "panel": { + "width": 300 + }, + "files": [ + "content/I18n.qml", + "assets/preview-widget.png" + ], + "capabilities": { + "densities": [ + "glyph", + "full" + ] + }, + "defaults": { + "host": "topbarGlyph", + "icon": "power_settings_new", + "label": "Session" + }, + "dependencies": { + "commands": [ + "systemctl", + "ryoku-shell" + ] + }, + "metadata": { + "settings": [] + } +} diff --git a/plugins/power-button/product-manifest.json b/plugins/power-button/product-manifest.json new file mode 100644 index 0000000..1e0ccbc --- /dev/null +++ b/plugins/power-button/product-manifest.json @@ -0,0 +1,97 @@ +{ + "schema": 1, + "id": "power-button", + "category": "plugins", + "version": "0.2.2", + "destination": "ryoku/plugins/power-button", + "files": [ + { + "source": ".gitignore", + "destination": ".gitignore", + "sha256": "38496ccd4fe21653a7f478ab5027836ac107b495b96bf6eb34540454d960f5cd", + "mode": "0644", + "size": 297, + "install": true + }, + { + "source": "AGENTS.md", + "destination": "AGENTS.md", + "sha256": "c049ede874ffaf5033d7e4c2d64b6074d63fd50da78b55e40b7ae19120bba0fa", + "mode": "0644", + "size": 3950, + "install": true + }, + { + "source": "CLAUDE.md", + "destination": "CLAUDE.md", + "sha256": "09ffb8ebdb8adf50bf4bde26dfe2109b4af3a4a8cc3f30cc536be42bb912c033", + "mode": "0644", + "size": 152, + "install": true + }, + { + "source": "LICENSE", + "destination": "LICENSE", + "sha256": "97483adbcfff65229fdf21ea76178690f1bfe3ccd5fbde97e344e04d625dc4bd", + "mode": "0644", + "size": 1062, + "install": false + }, + { + "source": "README.md", + "destination": "README.md", + "sha256": "44c96615c4e8f6a98a51108d049c6b0e0165d932056ec733d288819594cc2701", + "mode": "0644", + "size": 3289, + "install": false + }, + { + "source": "assets/preview-widget.png", + "destination": "assets/preview-widget.png", + "sha256": "f69e09d776b7243b3a2fec7c7ac5f607db53953a03f571bf694b6babe044bc39", + "mode": "0644", + "size": 27366, + "install": false + }, + { + "source": "content/I18n.qml", + "destination": "content/I18n.qml", + "sha256": "44f9942a4a808c359abcf7c6c2f94c5ef88a9beab7016bc72fe572455fac7ef0", + "mode": "0644", + "size": 1384, + "install": true + }, + { + "source": "content/Panel.qml", + "destination": "content/Panel.qml", + "sha256": "8fb79dd618ca787eed13cd69e1aa3b490e138e013a6198ed61fd74cf4a5139f1", + "mode": "0644", + "size": 4481, + "install": true + }, + { + "source": "content/Widget.qml", + "destination": "content/Widget.qml", + "sha256": "55c4f2091f0eabae0bde763ffbee1b1c714b82ed123fefefa64643b597b52308", + "mode": "0644", + "size": 1482, + "install": true + }, + { + "source": "manifest.json", + "destination": "manifest.json", + "sha256": "4a8162e52d522f00dabf5ee48e97d97420e474d950f97e9b2842d65714cbdc25", + "mode": "0644", + "size": 904, + "install": true + }, + { + "source": "service/Main.qml", + "destination": "service/Main.qml", + "sha256": "743bb125c13a59d1a1f4ee62a1dc3f40bf1c1bf9991f8d1de9caded0b69729bb", + "mode": "0644", + "size": 626, + "install": true + } + ] +} diff --git a/plugins/power-button/service/Main.qml b/plugins/power-button/service/Main.qml new file mode 100644 index 0000000..bfed65e --- /dev/null +++ b/plugins/power-button/service/Main.qml @@ -0,0 +1,28 @@ +pragma ComponentBehavior: Bound + +import QtQuick +import Quickshell + +// Session power actions. No UI here — the panel lists choices, then calls these. +Item { + id: svc + + property var pluginApi + + function powerOff() { + Quickshell.execDetached(["systemctl", "poweroff"]); + } + + function reboot() { + Quickshell.execDetached(["systemctl", "reboot"]); + } + + function hibernate() { + Quickshell.execDetached(["systemctl", "hibernate"]); + } + + // Same path as QS Bar / Super+L: ryoku-shell → qylock. + function lock() { + Quickshell.execDetached(["ryoku-shell", "lock"]); + } +} diff --git a/plugins/registry.json b/plugins/registry.json index ee1011f..5b73aef 100644 --- a/plugins/registry.json +++ b/plugins/registry.json @@ -1651,6 +1651,35 @@ "topbarGlyph" ], "lastUpdated": "2026-10-07" + }, + { + "id": "power-button", + "name": "Session", + "version": "0.2.2", + "path": "plugins/power-button", + "author": "Felix ", + "summary": "Session menu on the QS Bar: shut down, reboot, hibernate, or lock via ryoku-shell.", + "description": "Session menu on the QS Bar: shut down, reboot, hibernate, or lock via ryoku-shell.", + "tags": [ + "session", + "power", + "bar-widget" + ], + "accent": "#8f8378", + "surface": "#101010", + "preview": "assets/preview-widget.png", + "screenshots": [ + "assets/preview-widget.png" + ], + "manifest": "product-manifest.json", + "manifestSha256": "b8460b8499a0c361bc043a838cdf8255a474ae91b1073a9a9cfe7dfb5327ff96", + "official": false, + "tagline": "Session menu on the QS Bar: shut down, reboot, hibernate, or lock via ryoku-shell.", + "icon": "power_settings_new", + "hosts": [ + "topbarGlyph" + ], + "lastUpdated": "2026-10-08" } ] } From 0a589b398a12095bff41986fa0490ee03e32fbf4 Mon Sep 17 00:00:00 2001 From: Leandro Felix Date: Thu, 8 Oct 2026 20:24:58 -0300 Subject: [PATCH 2/4] fix(plugins): add upstream URL for Session (power-button) Ryostore requires upstream on registry entries so the Store can link the author's repo. --- plugins/registry.json | 81 ++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/plugins/registry.json b/plugins/registry.json index 5b73aef..bdfcbb1 100644 --- a/plugins/registry.json +++ b/plugins/registry.json @@ -561,8 +561,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "Your photo in any of 34 Material shapes, drop-replaceable and resizeable — the illogical-impulse image tile.", - "description": "Your photo in any of 34 Material shapes, drop-replaceable and resizeable — the illogical-impulse image tile.", + "summary": "Your photo in any of 34 Material shapes, drop-replaceable and resizeable \u2014 the illogical-impulse image tile.", + "description": "Your photo in any of 34 Material shapes, drop-replaceable and resizeable \u2014 the illogical-impulse image tile.", "tags": [ "image", "photo", @@ -580,7 +580,7 @@ "manifest": "product-manifest.json", "manifestSha256": "b1edf3f8847d8bbba515cdfb20d158c8f6e625242017cd18ca5d49a77b3fdf3e", "official": false, - "tagline": "Your photo in any of 34 Material shapes, drop-replaceable and resizeable — the illogical-impulse image tile.", + "tagline": "Your photo in any of 34 Material shapes, drop-replaceable and resizeable \u2014 the illogical-impulse image tile.", "icon": "image", "hosts": [ "desktopWidget" @@ -630,8 +630,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "MPRIS player tile with cover art, waveform seekbar, controls and synced lyrics from lrclib — the illogical-impulse media widget.", - "description": "MPRIS player tile with cover art, waveform seekbar, controls and synced lyrics from lrclib — the illogical-impulse media widget.", + "summary": "MPRIS player tile with cover art, waveform seekbar, controls and synced lyrics from lrclib \u2014 the illogical-impulse media widget.", + "description": "MPRIS player tile with cover art, waveform seekbar, controls and synced lyrics from lrclib \u2014 the illogical-impulse media widget.", "tags": [ "media", "player", @@ -650,7 +650,7 @@ "manifest": "product-manifest.json", "manifestSha256": "2288a1f44e787a711dfb9c7400d10d836d73e3a974d1566f467b9949c266559b", "official": false, - "tagline": "MPRIS player tile with cover art, waveform seekbar, controls and synced lyrics from lrclib — the illogical-impulse media widget.", + "tagline": "MPRIS player tile with cover art, waveform seekbar, controls and synced lyrics from lrclib \u2014 the illogical-impulse media widget.", "icon": "music_note", "hosts": [ "desktopWidget" @@ -704,8 +704,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "Flip card with a scrollable note pad and inline editing, autosaved to the plugin's own state — the illogical-impulse notes.", - "description": "Flip card with a scrollable note pad and inline editing, autosaved to the plugin's own state — the illogical-impulse notes.", + "summary": "Flip card with a scrollable note pad and inline editing, autosaved to the plugin's own state \u2014 the illogical-impulse notes.", + "description": "Flip card with a scrollable note pad and inline editing, autosaved to the plugin's own state \u2014 the illogical-impulse notes.", "tags": [ "notes", "stickies", @@ -723,7 +723,7 @@ "manifest": "product-manifest.json", "manifestSha256": "db04da19bff2995b835ca7aee06c251b9b7226f035e12a9d48a50dc5fabea2e7", "official": false, - "tagline": "Flip card with a scrollable note pad and inline editing, autosaved to the plugin's own state — the illogical-impulse notes.", + "tagline": "Flip card with a scrollable note pad and inline editing, autosaved to the plugin's own state \u2014 the illogical-impulse notes.", "icon": "sticky_note_2", "hosts": [ "desktopWidget" @@ -777,8 +777,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "CPU, memory, disk and battery gauges read live from /proc, /sys and UPower — the illogical-impulse resources card.", - "description": "CPU, memory, disk and battery gauges read live from /proc, /sys and UPower — the illogical-impulse resources card.", + "summary": "CPU, memory, disk and battery gauges read live from /proc, /sys and UPower \u2014 the illogical-impulse resources card.", + "description": "CPU, memory, disk and battery gauges read live from /proc, /sys and UPower \u2014 the illogical-impulse resources card.", "tags": [ "system", "cpu", @@ -797,7 +797,7 @@ "manifest": "product-manifest.json", "manifestSha256": "ac2bb8330645c58ca97f3564cde021792d80eb46eb8395d2bfd160a83e02353c", "official": false, - "tagline": "CPU, memory, disk and battery gauges read live from /proc, /sys and UPower — the illogical-impulse resources card.", + "tagline": "CPU, memory, disk and battery gauges read live from /proc, /sys and UPower \u2014 the illogical-impulse resources card.", "icon": "speed", "hosts": [ "desktopWidget" @@ -812,8 +812,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "Rotatable sticker tile with outline colour, drop-replaceable — the illogical-impulse sticker.", - "description": "Rotatable sticker tile with outline colour, drop-replaceable — the illogical-impulse sticker.", + "summary": "Rotatable sticker tile with outline colour, drop-replaceable \u2014 the illogical-impulse sticker.", + "description": "Rotatable sticker tile with outline colour, drop-replaceable \u2014 the illogical-impulse sticker.", "tags": [ "sticker", "image", @@ -831,7 +831,7 @@ "manifest": "product-manifest.json", "manifestSha256": "6b121640256b9e40aa8aa05c6b142fe231325ffe4b9998599ba14578052e5762", "official": false, - "tagline": "Rotatable sticker tile with outline colour, drop-replaceable — the illogical-impulse sticker.", + "tagline": "Rotatable sticker tile with outline colour, drop-replaceable \u2014 the illogical-impulse sticker.", "icon": "stk", "hosts": [ "desktopWidget" @@ -885,8 +885,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "Floating desktop text in eight bundled handwriting fonts with inline editing — the illogical-impulse custom text.", - "description": "Floating desktop text in eight bundled handwriting fonts with inline editing — the illogical-impulse custom text.", + "summary": "Floating desktop text in eight bundled handwriting fonts with inline editing \u2014 the illogical-impulse custom text.", + "description": "Floating desktop text in eight bundled handwriting fonts with inline editing \u2014 the illogical-impulse custom text.", "tags": [ "text", "notes", @@ -904,7 +904,7 @@ "manifest": "product-manifest.json", "manifestSha256": "27e208845abf11805f6640771a3c164298de255369758476fdb25495489d6cfd", "official": false, - "tagline": "Floating desktop text in eight bundled handwriting fonts with inline editing — the illogical-impulse custom text.", + "tagline": "Floating desktop text in eight bundled handwriting fonts with inline editing \u2014 the illogical-impulse custom text.", "icon": "text_fields", "hosts": [ "desktopWidget" @@ -958,8 +958,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "Pomodoro, stopwatch and countdown on one tile with ring progress and desktop alerts — the illogical-impulse timers.", - "description": "Pomodoro, stopwatch and countdown on one tile with ring progress and desktop alerts — the illogical-impulse timers.", + "summary": "Pomodoro, stopwatch and countdown on one tile with ring progress and desktop alerts \u2014 the illogical-impulse timers.", + "description": "Pomodoro, stopwatch and countdown on one tile with ring progress and desktop alerts \u2014 the illogical-impulse timers.", "tags": [ "timer", "pomodoro", @@ -978,7 +978,7 @@ "manifest": "product-manifest.json", "manifestSha256": "115651c181fef768b19fd0cce2001ee56b9a338c4a9d9d323c4184b3242e5529", "official": false, - "tagline": "Pomodoro, stopwatch and countdown on one tile with ring progress and desktop alerts — the illogical-impulse timers.", + "tagline": "Pomodoro, stopwatch and countdown on one tile with ring progress and desktop alerts \u2014 the illogical-impulse timers.", "icon": "timer", "hosts": [ "desktopWidget" @@ -993,8 +993,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "Flip card with a checkable task list, progress ring and inline add — the illogical-impulse todo.", - "description": "Flip card with a checkable task list, progress ring and inline add — the illogical-impulse todo.", + "summary": "Flip card with a checkable task list, progress ring and inline add \u2014 the illogical-impulse todo.", + "description": "Flip card with a checkable task list, progress ring and inline add \u2014 the illogical-impulse todo.", "tags": [ "todo", "tasks", @@ -1012,7 +1012,7 @@ "manifest": "product-manifest.json", "manifestSha256": "1e5289210ed54c0b19377545cd88061b6d6c6d301dafc082a95c07a057bd2c60", "official": false, - "tagline": "Flip card with a checkable task list, progress ring and inline add — the illogical-impulse todo.", + "tagline": "Flip card with a checkable task list, progress ring and inline add \u2014 the illogical-impulse todo.", "icon": "checklist", "hosts": [ "desktopWidget" @@ -1027,8 +1027,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "Greeting card with your name, host, uptime and weather quip plus lock, settings and session buttons — the illogical-impulse user card.", - "description": "Greeting card with your name, host, uptime and weather quip plus lock, settings and session buttons — the illogical-impulse user card.", + "summary": "Greeting card with your name, host, uptime and weather quip plus lock, settings and session buttons \u2014 the illogical-impulse user card.", + "description": "Greeting card with your name, host, uptime and weather quip plus lock, settings and session buttons \u2014 the illogical-impulse user card.", "tags": [ "user", "system", @@ -1047,7 +1047,7 @@ "manifest": "product-manifest.json", "manifestSha256": "29cba4f9a43163f39c0c58f2e4311a474d2ccd33e447f40a778630970b326c4c", "official": false, - "tagline": "Greeting card with your name, host, uptime and weather quip plus lock, settings and session buttons — the illogical-impulse user card.", + "tagline": "Greeting card with your name, host, uptime and weather quip plus lock, settings and session buttons \u2014 the illogical-impulse user card.", "icon": "badge", "hosts": [ "desktopWidget" @@ -1062,8 +1062,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "Live audio spectrum with five styles — bars, mirror, aurora, ring and dots — driven by your own playback stream.", - "description": "Live audio spectrum with five styles — bars, mirror, aurora, ring and dots — driven by your own playback stream.", + "summary": "Live audio spectrum with five styles \u2014 bars, mirror, aurora, ring and dots \u2014 driven by your own playback stream.", + "description": "Live audio spectrum with five styles \u2014 bars, mirror, aurora, ring and dots \u2014 driven by your own playback stream.", "tags": [ "visualizer", "audio", @@ -1082,7 +1082,7 @@ "manifest": "product-manifest.json", "manifestSha256": "1639400afe0a34293ec93f5d23c0d1a507c60a330b294cb8560346e01f879307", "official": false, - "tagline": "Live audio spectrum with five styles — bars, mirror, aurora, ring and dots — driven by your own playback stream.", + "tagline": "Live audio spectrum with five styles \u2014 bars, mirror, aurora, ring and dots \u2014 driven by your own playback stream.", "icon": "equalizer", "hosts": [ "desktopWidget" @@ -1131,8 +1131,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "Up to four analog clocks for timezones you pick, with live UTC offsets — the illogical-impulse world clock.", - "description": "Up to four analog clocks for timezones you pick, with live UTC offsets — the illogical-impulse world clock.", + "summary": "Up to four analog clocks for timezones you pick, with live UTC offsets \u2014 the illogical-impulse world clock.", + "description": "Up to four analog clocks for timezones you pick, with live UTC offsets \u2014 the illogical-impulse world clock.", "tags": [ "clock", "timezones", @@ -1150,7 +1150,7 @@ "manifest": "product-manifest.json", "manifestSha256": "7f0f0ebe77d087ea80db4f2fc915b1ae5b35e5d334b3ce4612fb37c99d2b515e", "official": false, - "tagline": "Up to four analog clocks for timezones you pick, with live UTC offsets — the illogical-impulse world clock.", + "tagline": "Up to four analog clocks for timezones you pick, with live UTC offsets \u2014 the illogical-impulse world clock.", "icon": "public", "hosts": [ "desktopWidget" @@ -1294,12 +1294,12 @@ }, { "id": "public-ip", - "name": "IP Pública", + "name": "IP P\u00fablica", "version": "0.1.0", "path": "plugins/public-ip", "author": "vampirejsv ", - "summary": "Muestra la IP pública actual (consultando https://checkip.", - "description": "Muestra la IP pública actual (consultando https://checkip.amazonaws.com/) en la barra; un clic la copia al portapapeles.", + "summary": "Muestra la IP p\u00fablica actual (consultando https://checkip.", + "description": "Muestra la IP p\u00fablica actual (consultando https://checkip.amazonaws.com/) en la barra; un clic la copia al portapapeles.", "tags": [ "bar-widget" ], @@ -1312,7 +1312,7 @@ "manifest": "product-manifest.json", "manifestSha256": "eced7c39a65f038744a15ea4577d65648243e948521fa46d80b1f107eb9b2cc0", "official": false, - "tagline": "Muestra la IP pública actual (consultando https://checkip.", + "tagline": "Muestra la IP p\u00fablica actual (consultando https://checkip.", "icon": "public", "hosts": [ "topbarGlyph" @@ -1658,7 +1658,7 @@ "version": "0.2.2", "path": "plugins/power-button", "author": "Felix ", - "summary": "Session menu on the QS Bar: shut down, reboot, hibernate, or lock via ryoku-shell.", + "summary": "Session menu on the QS Bar: shut down, reboot, hibernate, or lock.", "description": "Session menu on the QS Bar: shut down, reboot, hibernate, or lock via ryoku-shell.", "tags": [ "session", @@ -1674,12 +1674,13 @@ "manifest": "product-manifest.json", "manifestSha256": "b8460b8499a0c361bc043a838cdf8255a474ae91b1073a9a9cfe7dfb5327ff96", "official": false, - "tagline": "Session menu on the QS Bar: shut down, reboot, hibernate, or lock via ryoku-shell.", + "tagline": "Session menu on the QS Bar: shut down, reboot, hibernate, or lock.", "icon": "power_settings_new", "hosts": [ "topbarGlyph" ], - "lastUpdated": "2026-10-08" + "lastUpdated": "2026-10-08", + "upstream": "https://github.com/leandrofelix-dev/power-button" } ] } From 286a05555adb8e8e78cac9dd9dd111b3c1956bba Mon Sep 17 00:00:00 2001 From: Leandro Felix Date: Thu, 8 Oct 2026 20:25:30 -0300 Subject: [PATCH 3/4] fix(plugins): set Session upstream without registry reformat --- plugins/registry.json | 82 +++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/plugins/registry.json b/plugins/registry.json index bdfcbb1..caecec2 100644 --- a/plugins/registry.json +++ b/plugins/registry.json @@ -561,8 +561,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "Your photo in any of 34 Material shapes, drop-replaceable and resizeable \u2014 the illogical-impulse image tile.", - "description": "Your photo in any of 34 Material shapes, drop-replaceable and resizeable \u2014 the illogical-impulse image tile.", + "summary": "Your photo in any of 34 Material shapes, drop-replaceable and resizeable — the illogical-impulse image tile.", + "description": "Your photo in any of 34 Material shapes, drop-replaceable and resizeable — the illogical-impulse image tile.", "tags": [ "image", "photo", @@ -580,7 +580,7 @@ "manifest": "product-manifest.json", "manifestSha256": "b1edf3f8847d8bbba515cdfb20d158c8f6e625242017cd18ca5d49a77b3fdf3e", "official": false, - "tagline": "Your photo in any of 34 Material shapes, drop-replaceable and resizeable \u2014 the illogical-impulse image tile.", + "tagline": "Your photo in any of 34 Material shapes, drop-replaceable and resizeable — the illogical-impulse image tile.", "icon": "image", "hosts": [ "desktopWidget" @@ -630,8 +630,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "MPRIS player tile with cover art, waveform seekbar, controls and synced lyrics from lrclib \u2014 the illogical-impulse media widget.", - "description": "MPRIS player tile with cover art, waveform seekbar, controls and synced lyrics from lrclib \u2014 the illogical-impulse media widget.", + "summary": "MPRIS player tile with cover art, waveform seekbar, controls and synced lyrics from lrclib — the illogical-impulse media widget.", + "description": "MPRIS player tile with cover art, waveform seekbar, controls and synced lyrics from lrclib — the illogical-impulse media widget.", "tags": [ "media", "player", @@ -650,7 +650,7 @@ "manifest": "product-manifest.json", "manifestSha256": "2288a1f44e787a711dfb9c7400d10d836d73e3a974d1566f467b9949c266559b", "official": false, - "tagline": "MPRIS player tile with cover art, waveform seekbar, controls and synced lyrics from lrclib \u2014 the illogical-impulse media widget.", + "tagline": "MPRIS player tile with cover art, waveform seekbar, controls and synced lyrics from lrclib — the illogical-impulse media widget.", "icon": "music_note", "hosts": [ "desktopWidget" @@ -704,8 +704,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "Flip card with a scrollable note pad and inline editing, autosaved to the plugin's own state \u2014 the illogical-impulse notes.", - "description": "Flip card with a scrollable note pad and inline editing, autosaved to the plugin's own state \u2014 the illogical-impulse notes.", + "summary": "Flip card with a scrollable note pad and inline editing, autosaved to the plugin's own state — the illogical-impulse notes.", + "description": "Flip card with a scrollable note pad and inline editing, autosaved to the plugin's own state — the illogical-impulse notes.", "tags": [ "notes", "stickies", @@ -723,7 +723,7 @@ "manifest": "product-manifest.json", "manifestSha256": "db04da19bff2995b835ca7aee06c251b9b7226f035e12a9d48a50dc5fabea2e7", "official": false, - "tagline": "Flip card with a scrollable note pad and inline editing, autosaved to the plugin's own state \u2014 the illogical-impulse notes.", + "tagline": "Flip card with a scrollable note pad and inline editing, autosaved to the plugin's own state — the illogical-impulse notes.", "icon": "sticky_note_2", "hosts": [ "desktopWidget" @@ -777,8 +777,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "CPU, memory, disk and battery gauges read live from /proc, /sys and UPower \u2014 the illogical-impulse resources card.", - "description": "CPU, memory, disk and battery gauges read live from /proc, /sys and UPower \u2014 the illogical-impulse resources card.", + "summary": "CPU, memory, disk and battery gauges read live from /proc, /sys and UPower — the illogical-impulse resources card.", + "description": "CPU, memory, disk and battery gauges read live from /proc, /sys and UPower — the illogical-impulse resources card.", "tags": [ "system", "cpu", @@ -797,7 +797,7 @@ "manifest": "product-manifest.json", "manifestSha256": "ac2bb8330645c58ca97f3564cde021792d80eb46eb8395d2bfd160a83e02353c", "official": false, - "tagline": "CPU, memory, disk and battery gauges read live from /proc, /sys and UPower \u2014 the illogical-impulse resources card.", + "tagline": "CPU, memory, disk and battery gauges read live from /proc, /sys and UPower — the illogical-impulse resources card.", "icon": "speed", "hosts": [ "desktopWidget" @@ -812,8 +812,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "Rotatable sticker tile with outline colour, drop-replaceable \u2014 the illogical-impulse sticker.", - "description": "Rotatable sticker tile with outline colour, drop-replaceable \u2014 the illogical-impulse sticker.", + "summary": "Rotatable sticker tile with outline colour, drop-replaceable — the illogical-impulse sticker.", + "description": "Rotatable sticker tile with outline colour, drop-replaceable — the illogical-impulse sticker.", "tags": [ "sticker", "image", @@ -831,7 +831,7 @@ "manifest": "product-manifest.json", "manifestSha256": "6b121640256b9e40aa8aa05c6b142fe231325ffe4b9998599ba14578052e5762", "official": false, - "tagline": "Rotatable sticker tile with outline colour, drop-replaceable \u2014 the illogical-impulse sticker.", + "tagline": "Rotatable sticker tile with outline colour, drop-replaceable — the illogical-impulse sticker.", "icon": "stk", "hosts": [ "desktopWidget" @@ -885,8 +885,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "Floating desktop text in eight bundled handwriting fonts with inline editing \u2014 the illogical-impulse custom text.", - "description": "Floating desktop text in eight bundled handwriting fonts with inline editing \u2014 the illogical-impulse custom text.", + "summary": "Floating desktop text in eight bundled handwriting fonts with inline editing — the illogical-impulse custom text.", + "description": "Floating desktop text in eight bundled handwriting fonts with inline editing — the illogical-impulse custom text.", "tags": [ "text", "notes", @@ -904,7 +904,7 @@ "manifest": "product-manifest.json", "manifestSha256": "27e208845abf11805f6640771a3c164298de255369758476fdb25495489d6cfd", "official": false, - "tagline": "Floating desktop text in eight bundled handwriting fonts with inline editing \u2014 the illogical-impulse custom text.", + "tagline": "Floating desktop text in eight bundled handwriting fonts with inline editing — the illogical-impulse custom text.", "icon": "text_fields", "hosts": [ "desktopWidget" @@ -958,8 +958,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "Pomodoro, stopwatch and countdown on one tile with ring progress and desktop alerts \u2014 the illogical-impulse timers.", - "description": "Pomodoro, stopwatch and countdown on one tile with ring progress and desktop alerts \u2014 the illogical-impulse timers.", + "summary": "Pomodoro, stopwatch and countdown on one tile with ring progress and desktop alerts — the illogical-impulse timers.", + "description": "Pomodoro, stopwatch and countdown on one tile with ring progress and desktop alerts — the illogical-impulse timers.", "tags": [ "timer", "pomodoro", @@ -978,7 +978,7 @@ "manifest": "product-manifest.json", "manifestSha256": "115651c181fef768b19fd0cce2001ee56b9a338c4a9d9d323c4184b3242e5529", "official": false, - "tagline": "Pomodoro, stopwatch and countdown on one tile with ring progress and desktop alerts \u2014 the illogical-impulse timers.", + "tagline": "Pomodoro, stopwatch and countdown on one tile with ring progress and desktop alerts — the illogical-impulse timers.", "icon": "timer", "hosts": [ "desktopWidget" @@ -993,8 +993,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "Flip card with a checkable task list, progress ring and inline add \u2014 the illogical-impulse todo.", - "description": "Flip card with a checkable task list, progress ring and inline add \u2014 the illogical-impulse todo.", + "summary": "Flip card with a checkable task list, progress ring and inline add — the illogical-impulse todo.", + "description": "Flip card with a checkable task list, progress ring and inline add — the illogical-impulse todo.", "tags": [ "todo", "tasks", @@ -1012,7 +1012,7 @@ "manifest": "product-manifest.json", "manifestSha256": "1e5289210ed54c0b19377545cd88061b6d6c6d301dafc082a95c07a057bd2c60", "official": false, - "tagline": "Flip card with a checkable task list, progress ring and inline add \u2014 the illogical-impulse todo.", + "tagline": "Flip card with a checkable task list, progress ring and inline add — the illogical-impulse todo.", "icon": "checklist", "hosts": [ "desktopWidget" @@ -1027,8 +1027,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "Greeting card with your name, host, uptime and weather quip plus lock, settings and session buttons \u2014 the illogical-impulse user card.", - "description": "Greeting card with your name, host, uptime and weather quip plus lock, settings and session buttons \u2014 the illogical-impulse user card.", + "summary": "Greeting card with your name, host, uptime and weather quip plus lock, settings and session buttons — the illogical-impulse user card.", + "description": "Greeting card with your name, host, uptime and weather quip plus lock, settings and session buttons — the illogical-impulse user card.", "tags": [ "user", "system", @@ -1047,7 +1047,7 @@ "manifest": "product-manifest.json", "manifestSha256": "29cba4f9a43163f39c0c58f2e4311a474d2ccd33e447f40a778630970b326c4c", "official": false, - "tagline": "Greeting card with your name, host, uptime and weather quip plus lock, settings and session buttons \u2014 the illogical-impulse user card.", + "tagline": "Greeting card with your name, host, uptime and weather quip plus lock, settings and session buttons — the illogical-impulse user card.", "icon": "badge", "hosts": [ "desktopWidget" @@ -1062,8 +1062,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "Live audio spectrum with five styles \u2014 bars, mirror, aurora, ring and dots \u2014 driven by your own playback stream.", - "description": "Live audio spectrum with five styles \u2014 bars, mirror, aurora, ring and dots \u2014 driven by your own playback stream.", + "summary": "Live audio spectrum with five styles — bars, mirror, aurora, ring and dots — driven by your own playback stream.", + "description": "Live audio spectrum with five styles — bars, mirror, aurora, ring and dots — driven by your own playback stream.", "tags": [ "visualizer", "audio", @@ -1082,7 +1082,7 @@ "manifest": "product-manifest.json", "manifestSha256": "1639400afe0a34293ec93f5d23c0d1a507c60a330b294cb8560346e01f879307", "official": false, - "tagline": "Live audio spectrum with five styles \u2014 bars, mirror, aurora, ring and dots \u2014 driven by your own playback stream.", + "tagline": "Live audio spectrum with five styles — bars, mirror, aurora, ring and dots — driven by your own playback stream.", "icon": "equalizer", "hosts": [ "desktopWidget" @@ -1131,8 +1131,8 @@ "author": "pctrade (end4-pC) ", "upstream": "https://github.com/neur0map/MJ-widgets", "discord": "https://discord.gg/8KjBmUEyKA", - "summary": "Up to four analog clocks for timezones you pick, with live UTC offsets \u2014 the illogical-impulse world clock.", - "description": "Up to four analog clocks for timezones you pick, with live UTC offsets \u2014 the illogical-impulse world clock.", + "summary": "Up to four analog clocks for timezones you pick, with live UTC offsets — the illogical-impulse world clock.", + "description": "Up to four analog clocks for timezones you pick, with live UTC offsets — the illogical-impulse world clock.", "tags": [ "clock", "timezones", @@ -1150,7 +1150,7 @@ "manifest": "product-manifest.json", "manifestSha256": "7f0f0ebe77d087ea80db4f2fc915b1ae5b35e5d334b3ce4612fb37c99d2b515e", "official": false, - "tagline": "Up to four analog clocks for timezones you pick, with live UTC offsets \u2014 the illogical-impulse world clock.", + "tagline": "Up to four analog clocks for timezones you pick, with live UTC offsets — the illogical-impulse world clock.", "icon": "public", "hosts": [ "desktopWidget" @@ -1294,12 +1294,12 @@ }, { "id": "public-ip", - "name": "IP P\u00fablica", + "name": "IP Pública", "version": "0.1.0", "path": "plugins/public-ip", "author": "vampirejsv ", - "summary": "Muestra la IP p\u00fablica actual (consultando https://checkip.", - "description": "Muestra la IP p\u00fablica actual (consultando https://checkip.amazonaws.com/) en la barra; un clic la copia al portapapeles.", + "summary": "Muestra la IP pública actual (consultando https://checkip.", + "description": "Muestra la IP pública actual (consultando https://checkip.amazonaws.com/) en la barra; un clic la copia al portapapeles.", "tags": [ "bar-widget" ], @@ -1312,7 +1312,7 @@ "manifest": "product-manifest.json", "manifestSha256": "eced7c39a65f038744a15ea4577d65648243e948521fa46d80b1f107eb9b2cc0", "official": false, - "tagline": "Muestra la IP p\u00fablica actual (consultando https://checkip.", + "tagline": "Muestra la IP pública actual (consultando https://checkip.", "icon": "public", "hosts": [ "topbarGlyph" @@ -1658,7 +1658,8 @@ "version": "0.2.2", "path": "plugins/power-button", "author": "Felix ", - "summary": "Session menu on the QS Bar: shut down, reboot, hibernate, or lock.", + "upstream": "https://github.com/leandrofelix-dev/power-button", + "summary": "Session menu on the QS Bar: shut down, reboot, hibernate, or lock via ryoku-shell.", "description": "Session menu on the QS Bar: shut down, reboot, hibernate, or lock via ryoku-shell.", "tags": [ "session", @@ -1674,13 +1675,12 @@ "manifest": "product-manifest.json", "manifestSha256": "b8460b8499a0c361bc043a838cdf8255a474ae91b1073a9a9cfe7dfb5327ff96", "official": false, - "tagline": "Session menu on the QS Bar: shut down, reboot, hibernate, or lock.", + "tagline": "Session menu on the QS Bar: shut down, reboot, hibernate, or lock via ryoku-shell.", "icon": "power_settings_new", "hosts": [ "topbarGlyph" ], - "lastUpdated": "2026-10-08", - "upstream": "https://github.com/leandrofelix-dev/power-button" + "lastUpdated": "2026-10-08" } ] } From 96b61d6a30acd0e8ea4c1285f884e32925ca78ff Mon Sep 17 00:00:00 2001 From: Leandro Felix Date: Thu, 8 Oct 2026 20:25:44 -0300 Subject: [PATCH 4/4] fix(plugins): correct upstream indentation in registry entry --- plugins/registry.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/registry.json b/plugins/registry.json index caecec2..0aebe91 100644 --- a/plugins/registry.json +++ b/plugins/registry.json @@ -1658,7 +1658,7 @@ "version": "0.2.2", "path": "plugins/power-button", "author": "Felix ", - "upstream": "https://github.com/leandrofelix-dev/power-button", + "upstream": "https://github.com/leandrofelix-dev/power-button", "summary": "Session menu on the QS Bar: shut down, reboot, hibernate, or lock via ryoku-shell.", "description": "Session menu on the QS Bar: shut down, reboot, hibernate, or lock via ryoku-shell.", "tags": [