All plugins

@glafeara/omarchy-wireguard

Omawire v2.5.1

Tunnel status, transactional switching, import, rename, QR export, live traffic and drop notifications in the Omarchy bar. Unofficial third-party widget for WireGuard tunnels; not affiliated with the WireGuard project.

Unverified

Start with the source

Version 2.5.1

Read the code and installation instructions at this exact commit.

Inspect source
Source commitacffeb96cb40c207b0cc6698215c04cfb1b56231

The standard Omarchy install command follows upstream code and may install a different commit. Check the repository’s instructions before installing.

Release history

1 release
Published versions of Omawire
VersionPublishedPublisherRecord
v2.5.1Sep 9, 2026Upstream monitorReceipt ↗

What was checked

Manifest structure, declared files, QML parsing, repository identity and bounded source analysis passed at this commit.

PENDING REVIEW

Waiting for human review. No verification has been granted.

Security capabilities

Last scan: Sep 9, 2026

Automated security analysis is not a guarantee that a plugin is safe. “No match” means the scanner did not recognize a pattern; it is not proof of absence.

network · No match
shell · 98 matches

Panel.qml:269Quickshell.execDetached(["bash", "-c", "printf %s " + Util.shellQuote(text) + " | wl-copy"])

Service.qml:7// deactivates them through backend.sh (nmcli over D-Bus, authorized by

Service.qml:8// polkit — no sudo, no root shell, config hooks never run).

Service.qml:16readonly property string backendPath: String(Qt.resolvedUrl("backend.sh")).replace(/^file:\/\//, "")

Service.qml:93// Connection facts from `backend.sh details` — ip, ip6, endpoint, allowed,

Service.qml:209trafficProcess.command = ["bash", "-c", trafficScript, "wireguard"].concat(activeDevices)

Service.qml:216detailsProcess.command = ["bash", backendPath, "details", primaryUuid, primaryDevice]

Service.qml:241pingProcess.command = ["bash", "-c", pingScript, "wireguard",

Service.qml:542saveProcess.command = ["bash", "-c",

Service.qml:670editProcess.command = ["bash", backendPath, "edit", _editUuid, _editName]

Service.qml:698exportProcess.command = ["bash", backendPath, "export-file", profile.uuid, dest]

Service.qml:723qrProcess.command = ["bash", backendPath, "qr-png", profile.uuid]

process · 30 matches

Service.qml:508// Queued, not fired directly: the process may be busy, and a lost

Service.qml:707// closeQr retracts a render but lets it finish, so the process can be

Service.qml:731// process handler deletes an unwanted result instead of keeping it.

Service.qml:732// The process itself is left to finish: killing qrencode mid-write would

Service.qml:742// Each path gets its own detached remover. A shared Process can have its

Service.qml:777// Deferred through a timer because the editor process that produced the

Service.qml:869// is world-readable through /proc/<pid>/cmdline for as long as the process

Service.qml:894" exec zenity --file-selection --title='Import WireGuard config' \\\n" +

Service.qml:897" exec kdialog --getopenfilename \"$HOME\" '*.conf|WireGuard config'\n" +

Service.qml:899" exec yad --file --title='Import WireGuard config'\n" +

Service.qml:1050Process {

Service.qml:1080Process {

filesystemRead · 23 matches

Service.qml:908" printf '%s %s %s\\n' \"$d\" \"$(cat \"$s/rx_bytes\")\" \"$(cat \"$s/tx_bytes\")\"\n" +

Service.qml:990FileView {

backend.sh:183t="$(cat "$f" 2>/dev/null)" || t=0

backend.sh:270live="$(cat "/sys/class/net/$ifname/mtu" 2>/dev/null)" && [ -n "$live" ] && mtu="$live"

backend.sh:586uuid="$(cat /proc/sys/kernel/random/uuid 2>/dev/null)" ||

backend.sh:929seed="$(cat)"

backend.sh:947cat -- "$tmp"

tests/fake/mktemp:8[ -f "$count_file" ] && count="$(cat "$count_file")"

tests/fake/nmcli:22cat "$FAKE_DIR/list" 2>/dev/null

tests/fake/nmcli:31cat "$FAKE_DIR/partial-export.$u"

tests/fake/nmcli:35cat "$FAKE_DIR/export.$u"

tests/fake/nmcli:48cat "$FAKE_DIR/names" 2>/dev/null

filesystemWrite · 32 matches

Service.qml:543"mkdir -p \"$1\" && printf '%s' \"$2\" > \"$1/wireguard-last\"",

Service.qml:748if (knownPath !== "") Quickshell.execDetached(["rm", "-f", "--", knownPath])

Service.qml:752// current PNG is known to this instance, so remove only that path; do not

backend.sh:51# cleanup-runtime remove QR/editor files owned by a dead shell

backend.sh:594printf '%s\n' "Could not remove incomplete replacement $uuid; state is unknown — check connections manually" >&2

backend.sh:845# and Service destruction remove it; a hard crash is reaped on the next

backend.sh:860trap 'rm -f "$tmp"; exit 1' HUP INT TERM

backend.sh:861trap 'rm -f "$tmp"' EXIT

backend.sh:884trap 'rm -f -- "$png"; exit 1' HUP INT TERM

backend.sh:885trap 'rm -f -- "$png"' EXIT

backend.sh:892# Remove only known-safe stale secret-bearing runtime files. New-format names

backend.sh:909rm -f -- "$png"

environment · 664 matches

Service.qml:14readonly property string stateDir: Quickshell.env("HOME") + "/.local/state/omarchy"

Service.qml:897" exec kdialog --getopenfilename \"$HOME\" '*.conf|WireGuard config'\n" +

Service.qml:906" s=\"/sys/class/net/$d/statistics\"\n" +

Service.qml:907" [ -r \"$s/rx_bytes\" ] && [ -r \"$s/tx_bytes\" ] || continue\n" +

Service.qml:908" printf '%s %s %s\\n' \"$d\" \"$(cat \"$s/rx_bytes\")\" \"$(cat \"$s/tx_bytes\")\"\n" +

Service.qml:921"out=\"$(ping -n -q -c 1 -W 2 -I \"$dev\" -- \"$host\" 2>/dev/null)\" || rc=$?\n" +

Service.qml:922"if [ \"$rc\" != 0 ] && [ \"$rc\" != 1 ] && [ -n \"$src\" ]; then\n" +

Service.qml:924" out=\"$(ping -n -q -c 1 -W 2 -I \"$src\" -- \"$host\" 2>/dev/null)\" || rc=$?\n" +

Service.qml:926"[ \"$rc\" = 0 ] || exit \"$rc\"\n" +

Service.qml:927"printf '%s\\n' \"$out\" | awk -F/ '/^rtt|^round-trip/ {print $5; exit}'\n"

Service.qml:973"for pair in \"$@\"; do bash \"$be\" mark-active \"${pair%%:*}\" \"${pair#*:}\" || rc=1; done\n" +

Service.qml:974"exit $rc\n"

downloads · No match
downloadExecution · 1 matches

backend.sh:8# here ever eval()s config content, so a config file is data, not code.

obfuscation · No match
credentials · 18 matches

backend.sh:6# has network-control and settings.modify.system without a password on

backend.sh:243# nmcli runs *without* -s, so no secret is ever read, let alone printed —

backend.sh:275local chunk token count=0 endpoint="" allowed=""

backend.sh:283for token in $chunk; do

backend.sh:284case "${token%%=*}" in

backend.sh:285endpoint) endpoint="${token#*=}" ;;

backend.sh:286allowed-ips) allowed="${token#*=}"; allowed="${allowed//;/, }" ;;

backend.sh:813local chunk token first

backend.sh:820for token in $chunk; do

backend.sh:822echo "PublicKey = $token"

backend.sh:826key="${token%%=*}"

backend.sh:827value="${token#*=}"

Automated validation details

Static pattern analysis and qmllint parsing. Up to 12 evidence samples per capability; all matching lines counted. Absence of a match does not establish absence of a capability.

  • NamePrompt.qml: parsed, 216 diagnostics. Static parser only; Omarchy imports may be unavailable.
  • Panel.qml: parsed, 1284 diagnostics. Static parser only; Omarchy imports may be unavailable.
  • QrWindow.qml: parsed, 289 diagnostics. Static parser only; Omarchy imports may be unavailable.
  • RenameWindow.qml: parsed, 92 diagnostics. Static parser only; Omarchy imports may be unavailable.
  • Service.qml: parsed, 306 diagnostics. Static parser only; Omarchy imports may be unavailable.
Manifest at this commit
{
  "schemaVersion": 1,
  "id": "glafeara.wireguard",
  "name": "Omawire",
  "version": "2.5.1",
  "author": "glafeara",
  "license": "MIT",
  "description": "Tunnel status, transactional switching, import, rename, QR export, live traffic and drop notifications in the Omarchy bar. Unofficial third-party widget for WireGuard tunnels; not affiliated with the WireGuard project.",
  "kinds": [
    "bar-widget"
  ],
  "entryPoints": {
    "barWidget": "Panel.qml"
  },
  "barWidget": {
    "displayName": "Omawire",
    "description": "Toggle, switch and rename NetworkManager WireGuard tunnels, import .conf files, show QR codes, watch traffic, get a toast when a tunnel drops. No sudo required.",
    "category": "Network",
    "allowMultiple": false,
    "defaultSection": "right",
    "defaults": {
      "refreshIntervalSec": 10,
      "pingHost": "1.1.1.1"
    },
    "schema": [
      {
        "key": "refreshIntervalSec",
        "type": "integer",
        "label": "Refresh interval (seconds)",
        "min": 2,
        "max": 3600,
        "step": 1,
        "defaultValue": 10
      },
      {
        "key": "pingHost",
        "type": "string",
        "label": "Ping host (empty disables the latency probe)",
        "defaultValue": "1.1.1.1"
      }
    ]
  }
}

Review history

No human review recorded.

Report this plugin

A report requests a rescan and moderation. It does not remove a plugin automatically.

For authorized reviewers

Review this plugin

Inspect the source and scan above, choose a decision, then submit the prepared issue on GitHub. Only configured reviewer accounts can record a decision.

Reviewing commit acffeb96cb40c207b0cc6698215c04cfb1b56231. GitHub identity is checked by the registry before any decision is recorded.

Code review checklist

All notes are public. Do not include credentials or private vulnerability details.

Next: sign in with your reviewer account and submit the GitHub issue. Opening the draft does not record your decision.

These checks do not include runtime testing or a full dependency audit. Plugins run with your user permissions. Read the verification policy.

Manifest SHA-256 digest
04dd9211b3980d79931f5c0f3de5ae82883001d1522275e6c8c56bbba0e5a297