@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.
Start with the source
Version 2.5.1Read the code and installation instructions at this exact commit.
Inspect sourceacffeb96cb40c207b0cc6698215c04cfb1b56231The standard Omarchy install command follows upstream code and may install a different commit. Check the repository’s instructions before installing.
Release history
1 release| Version | Published | Publisher | Record |
|---|---|---|---|
| v2.5.1 | Sep 9, 2026 | Upstream monitor | Receipt ↗ |
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, 2026Automated 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:269 ↗Quickshell.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:16 ↗readonly 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:209 ↗trafficProcess.command = ["bash", "-c", trafficScript, "wireguard"].concat(activeDevices)
Service.qml:216 ↗detailsProcess.command = ["bash", backendPath, "details", primaryUuid, primaryDevice]
Service.qml:241 ↗pingProcess.command = ["bash", "-c", pingScript, "wireguard",
Service.qml:542 ↗saveProcess.command = ["bash", "-c",
Service.qml:670 ↗editProcess.command = ["bash", backendPath, "edit", _editUuid, _editName]
Service.qml:698 ↗exportProcess.command = ["bash", backendPath, "export-file", profile.uuid, dest]
Service.qml:723 ↗qrProcess.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:1050 ↗Process {
Service.qml:1080 ↗Process {
filesystemRead · 23 matches
Service.qml:908 ↗" printf '%s %s %s\\n' \"$d\" \"$(cat \"$s/rx_bytes\")\" \"$(cat \"$s/tx_bytes\")\"\n" +
Service.qml:990 ↗FileView {
backend.sh:183 ↗t="$(cat "$f" 2>/dev/null)" || t=0
backend.sh:270 ↗live="$(cat "/sys/class/net/$ifname/mtu" 2>/dev/null)" && [ -n "$live" ] && mtu="$live"
backend.sh:586 ↗uuid="$(cat /proc/sys/kernel/random/uuid 2>/dev/null)" ||
backend.sh:929 ↗seed="$(cat)"
backend.sh:947 ↗cat -- "$tmp"
tests/fake/mktemp:8 ↗[ -f "$count_file" ] && count="$(cat "$count_file")"
tests/fake/nmcli:22 ↗cat "$FAKE_DIR/list" 2>/dev/null
tests/fake/nmcli:31 ↗cat "$FAKE_DIR/partial-export.$u"
tests/fake/nmcli:35 ↗cat "$FAKE_DIR/export.$u"
tests/fake/nmcli:48 ↗cat "$FAKE_DIR/names" 2>/dev/null
filesystemWrite · 32 matches
Service.qml:543 ↗"mkdir -p \"$1\" && printf '%s' \"$2\" > \"$1/wireguard-last\"",
Service.qml:748 ↗if (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:594 ↗printf '%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:860 ↗trap 'rm -f "$tmp"; exit 1' HUP INT TERM
backend.sh:861 ↗trap 'rm -f "$tmp"' EXIT
backend.sh:884 ↗trap 'rm -f -- "$png"; exit 1' HUP INT TERM
backend.sh:885 ↗trap 'rm -f -- "$png"' EXIT
backend.sh:892 ↗# Remove only known-safe stale secret-bearing runtime files. New-format names
backend.sh:909 ↗rm -f -- "$png"
environment · 664 matches
Service.qml:14 ↗readonly 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:275 ↗local chunk token count=0 endpoint="" allowed=""
backend.sh:283 ↗for token in $chunk; do
backend.sh:284 ↗case "${token%%=*}" in
backend.sh:285 ↗endpoint) endpoint="${token#*=}" ;;
backend.sh:286 ↗allowed-ips) allowed="${token#*=}"; allowed="${allowed//;/, }" ;;
backend.sh:813 ↗local chunk token first
backend.sh:820 ↗for token in $chunk; do
backend.sh:822 ↗echo "PublicKey = $token"
backend.sh:826 ↗key="${token%%=*}"
backend.sh:827 ↗value="${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
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.
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