From a3d4bea9d07e4d6e36689342f6d05376b216e64d Mon Sep 17 00:00:00 2001 From: Anthony Poschen <2253299+AnthonyPoschen@users.noreply.github.com> Date: Sun, 11 Oct 2026 14:17:02 +1100 Subject: [PATCH] docs(agents): add plugin UI safety baseline (#7792) * docs(agents): add plugin UI safety baseline Document safe rendering and validation of dynamic plugin data after a marketplace review surfaced a QML AutoText boundary. Assisted-by: Codex/GPT-5 * docs(agents): allow consented background refreshes Clarify that plugin networking may refresh periodically when disclosed and user-controlled. Assisted-by: Codex/GPT-5 * docs(agents): keep plugin guide label concise Leave the safety baseline discoverable within the plugin guide without expanding its topic index label. Assisted-by: Codex/GPT-5 * docs(agents): point plugin authors at their own markup helper Omarchy ships no markup-neutralizing helper, and this skill is for installed systems, where the parent SKILL.md forbids editing the packaged shell components the old line suggested extending. Co-Authored-By: Codex Medium Co-Authored-By: Claude Opus 5.5 --------- Co-authored-by: Omarchybot <317366263+omarchybot@users.noreply.github.com> Co-authored-by: Codex Medium Co-authored-by: Claude Opus 5.5 --- default/agents/skills/omarchy/plugins.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/default/agents/skills/omarchy/plugins.md b/default/agents/skills/omarchy/plugins.md index 6e3ab069..ce6ab3f8 100644 --- a/default/agents/skills/omarchy/plugins.md +++ b/default/agents/skills/omarchy/plugins.md @@ -17,6 +17,25 @@ changes. `idle.screensaver` and `idle.lock` are seconds since user idle began. **Commands:** `omarchy restart shell`, `omarchy refresh shell` +## Plugin UI Safety + +Plugins run inside Omarchy's long-lived, unsandboxed shell. Treat text from network responses, files, IPC, settings, environment variables, and command output as untrusted. + +- QML `Text` defaults to `Text.AutoText`. Do not bind untrusted data to an AutoText sink: markup-shaped input such as `` can be interpreted as rich text and load a resource. +- For display text owned by the plugin, set `textFormat: Text.PlainText`. Prefer a local `PlainText` component when the plugin has multiple text elements. + +```qml +Text { + textFormat: Text.PlainText + text: modelData.name +} +``` + +- When passing dynamic text to an Omarchy-owned component whose internal `Text` format the plugin cannot set, neutralize markup in the plugin first with a helper of its own, and add a regression test; Omarchy ships no such helper. Never edit the packaged component to add a plain-text option: that belongs in a pull request to Omarchy. +- Bound and validate downloaded data before displaying or saving it: limit response and collection sizes, string lengths, identifiers, and timestamps. +- Keep network access explicit. Use fixed HTTPS sources, timeouts, response-size limits, and validation. For periodic background refreshes, disclose the behavior and let users enable or disable it. Never execute downloaded content or interpolate untrusted values into shell commands. +- Add regression coverage for markup-shaped input and every shared tooltip or notification sink that receives dynamic text. + ## Bar Layout Use the `omarchy bar` group to move and manage widgets: