omarchy-plugin-check independent community review · not affiliated with omarchy
caution

Omamail

omamail · Productivity · bar widget · huacnlee/omamail · ↗ marketplace
caution combined · worst of core + verified (1 trusted, 2 counted)
opc opc: caution mkt marketplace: caution reviewed 3d0d673 upstream 2d5f2bd
providertiersigverdict riskcounts ascriteria commit · treewhen
core sig caution 13 caution safe-to-run : passed no-net : failed no-exec : failed no-persist : passed no-priv : passed no-obfusc : passed no-secrets : passed human : not checked 3d0d673 c380273 2026-10-02
unsigned ≤caution unsigned caution — ≤ caution — 3d0d673 = 2026-08-20

verdict

opc · core
caution 13/100 risk

caution: score 13; 4 low; uses processExec, network, fileWrite

reasons
capabilities: processExec, network, fileWrite
criteria
safe-to-run : passed no-net : failed no-exec : failed no-persist : passed no-priv : passed no-obfusc : passed no-secrets : passed human : not checked
ai
no escalation
guard
canary control n/a tools schema

does

purpose
Gmail client for Omarchy: bar unread count plus a mail window using Google OAuth and the Gmail API, with on-disk caches and helper scripts.
kinds
servicebar-widgetpanel
entry
service → Service.qml
barWidget → BarWidget.qml
panel → App.qml
manifest
valid
scope
repository root · marketplace-listing

caps

level · evidence
write writes outside its dir filesystem · CacheStore.qml:122
persist survives restart
priv sudo / pkexec / polkit
pkg installs packages
bin ships binaries
clip reads/writes clipboard
screen captures screen
hypr controls the compositor
ext runs code it does not ship

areas

0 of 10 touched
shell not touched
hypr not touched
systemd not touched
pacman not touched
sudoers not touched
rc not touched
ssh not touched
browsers not touched
gpg not touched
dbus not touched

net

10 hosts

deps

0 vulns · 0 pkgs · 0 external

no dependencies

secrets

1

supply

scorecardn/aunavailable
pinnedn/a
signed14%commits
bus factor1
age44drepo age
unpinned fetch0remote code

inject

hidden unicode0
prompt injection0
obfuscation0

quality

loc23,362
lint errors8shellcheck · eslint · qmllint · bandit
lint warnings5,444
tests14files
docsreadme
licenseMIT
HTML 11,569 · 6 files QML 6,679 · 31 files JavaScript 4,492 · 17 files Shell 421 · 10 files Python 92 · 2 files YAML 58 · 2 files Makefile 51 · 1 files
hotspots
.github/workflows/release.yml AuthManager.qml

perf

spawns/min0estimated
timers8
keep loadedyesalways resident
large assets0
timerintervalrepeatspawns
App.qml:785 6 s no —
AuthManager.qml:593 0.12 s no —
AuthManager.qml:599 0.25 s no —
AuthManager.qml:605 180 s no —
CacheStore.qml:117 0.8 s no —
MailAccount.qml:828 30 s yes —
MailAccount.qml:835 4 s no —
MailAccount.qml:843 runtime yes —

activity

github
commits 90d56
contributors1
open issues31
releasev0.3.0
last commit2026-08-20
archivedn/a

diff

first review · nothing to diff

findings

4 above info · 154 info · 0 hard
low supply-chain .github/workflows/release.yml:5 zizmor · 50%
runtime artifacts potentially vulnerable to a cache poisoning attack (https://docs.zizmor.sh/audits/#cache-poisoning)
on:   push:     tags:       - "v*"
ai: unsure
low supply-chain .github/workflows/release.yml:17 zizmor · 90%
unpinned action reference (https://docs.zizmor.sh/audits/#unpinned-uses)
uses: actions/checkout@v4         with:           # Release notes are generated from the history since the last tag, so           # a shallow clone would produce an empty changelog.           fetch-depth: 0
ai confirmed
low supply-chain .github/workflows/release.yml:23 zizmor · 90%
unpinned action reference (https://docs.zizmor.sh/audits/#unpinned-uses)
uses: actions/setup-node@v4         with:           node-version: "20"        # The manifest version is what Omarchy installs and what the marketplace       # lists. A tag that disagrees with it would publish a release describing a       # version nobody can install, so it fails here instead.
ai confirmed
low exec AuthManager.qml:531–532 opengrep · 70%
Shell command string built by concatenation inside `sh -c` — command injection if any part is untrusted (network data, file names, user input).
toolProbe.command = ["sh", "-c",       "for tool in " + requiredTools.join(" ")
ai confirmed
154 info findings
info supply-chain .github/workflows/release.yml:17 zizmor · 50%
credential persistence through GitHub Actions artifacts (https://docs.zizmor.sh/audits/#artipacked)
info other Accounts.js malcontent · 60%
contains a client ID [MEDIUM]
info other AGENTS.md:92 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other App.qml malcontent · 60%
pipes to shell [MEDIUM]
info other AuthManager.qml malcontent · 60%
contains a client ID [MEDIUM]
info other AuthManager.qml malcontent · 60%
Uses OpenSSL [MEDIUM]
info other AuthManager.qml malcontent · 60%
Runs shell commands but throws output away [MEDIUM]
info other AuthManager.qml malcontent · 60%
upload content via HTTP form [MEDIUM]
info other AuthManager.qml malcontent · 60%
submits content to websites [MEDIUM]
info other AuthManager.qml malcontent · 60%
encodes URL, likely to pass GET variables [MEDIUM]
info network AuthManager.qml:321 opengrep · 90%
HTTP request from QML/JS (XMLHttpRequest / fetch).
info exec AuthManager.qml:417 opengrep · 90%
Detached process launch (Quickshell.execDetached / startDetached).
info exec AuthManager.qml:531 ai · 60%
The sh -c string is built only from the internal requiredTools list, so it is likely not injectable. I did not check that list's source.
info exec AuthManager.qml:531 opengrep · 90%
Runs a shell command string via `sh -c`.
info exec AuthManager.qml:553 opengrep · 90%
Quickshell Process — spawns external programs.
info exec AuthManager.qml:570 opengrep · 90%
Quickshell Process — spawns external programs.
info exec AuthManager.qml:611 opengrep · 90%
Quickshell Process — spawns external programs.
info exec AuthManager.qml:623 opengrep · 90%
Quickshell Process — spawns external programs.
info exec AuthManager.qml:643 opengrep · 90%
Quickshell Process — spawns external programs.
info exec AuthManager.qml:655 opengrep · 90%
Quickshell Process — spawns external programs.
info exec AuthManager.qml:680 opengrep · 90%
Quickshell Process — spawns external programs.
info exec BodyCache.qml:67 opengrep · 90%
Detached process launch (Quickshell.execDetached / startDetached).
info exec BodyCache.qml:108 opengrep · 90%
Detached process launch (Quickshell.execDetached / startDetached).
info exec BodyCache.qml:111 opengrep · 90%
Quickshell Process — spawns external programs.
info other CacheStore.qml malcontent · 60%
modifies file permissions [MEDIUM]
info exec CacheStore.qml:90 opengrep · 90%
Quickshell Process — spawns external programs.
info exec CacheStore.qml:94 opengrep · 90%
Runs a shell command string via `sh -c`.
info filesystem CacheStore.qml:122 opengrep · 90%
Writes files from QML (FileView.setText / JsonAdapter writeAdapter).
info other components/ActionIcon.qml malcontent · 60%
download files [MEDIUM]
info other components/MessageReader.qml malcontent · 60%
generic listen string [MEDIUM]
info other components/MessageReader.qml malcontent · 60%
requests resources via URL [MEDIUM]
info other components/SetupPage.qml malcontent · 60%
contains a client ID [MEDIUM]
info other Credentials.js malcontent · 60%
contains a client ID [MEDIUM]
info other Credentials.js malcontent · 60%
download files [MEDIUM]
info other Credentials.js malcontent · 60%
exchanges credentials with Google [MEDIUM]
info network Credentials.js:227 textscan · 100%
URL literal: https://accounts.google.com
info network Credentials.js:228 textscan · 100%
URL literal: https://oauth2.googleapis.com
info network Credentials.js:229 textscan · 100%
URL literal: https://www.googleapis.com
info network Credentials.js:231 textscan · 100%
URL literal: http://localhost
info other docs/SPEC.md:5 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other docs/superpowers/plans/2026-08-19-omarchy-gmail.md:7 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other docs/superpowers/plans/2026-08-19-omarchy-gmail.md:24 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other docs/superpowers/plans/2026-08-19-omarchy-gmail.md:490 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other docs/superpowers/plans/2026-08-19-omarchy-gmail.md:493 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other docs/superpowers/plans/2026-08-19-omarchy-gmail.md:536 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other docs/superpowers/plans/2026-08-19-omarchy-gmail.md:553 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other docs/superpowers/plans/2026-08-19-omarchy-gmail.md:557 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other docs/superpowers/plans/2026-08-19-omarchy-gmail.md:558 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other docs/superpowers/plans/2026-08-19-omarchy-gmail.md:929 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other docs/superpowers/plans/2026-08-19-omarchy-gmail.md:1569 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other docs/superpowers/plans/2026-08-19-omarchy-gmail.md:1780 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other docs/superpowers/plans/2026-08-19-omarchy-gmail.md:2102 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other docs/superpowers/plans/2026-08-19-omarchy-gmail.md:2403 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other docs/superpowers/plans/2026-08-19-omarchy-gmail.md:2699 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other docs/superpowers/plans/2026-08-19-omarchy-gmail.md:2864 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other docs/superpowers/plans/2026-08-19-omarchy-gmail.md:2869 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other docs/superpowers/plans/2026-08-19-omarchy-gmail.md:2909 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info network GmailApi.js:8 textscan · 100%
URL literal: https://gmail.googleapis.com
info network GmailApi.js:9 textscan · 100%
URL literal: https://mail.google.com
info other GmailApiClient.qml malcontent · 60%
upload content via HTTP form [MEDIUM]
info other GmailApiClient.qml malcontent · 60%
submits content to websites [MEDIUM]
info network GmailApiClient.qml:68 opengrep · 90%
HTTP request from QML/JS (XMLHttpRequest / fetch).
info other Html.js malcontent · 60%
complex math with parseInt or fromCharCode conversions [MEDIUM]
info other Html.js malcontent · 60%
Contains HTML content [MEDIUM]
info other Html.js malcontent · 60%
assembles strings from UTF-16 code units [MEDIUM]
info other Html.js malcontent · 60%
generic listen string [MEDIUM]
info network Html.js:174 textscan · 100%
URL literal: http://127.0.0.1
info other install.sh malcontent · 60%
Uses OpenSSL [MEDIUM]
info other install.sh malcontent · 60%
Runs shell commands but throws output away [MEDIUM]
info other install.sh:44 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other install.sh:67 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other install.sh:71 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other install.sh:72 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info exec MailAccount.qml:674 opengrep · 90%
Detached process launch (Quickshell.execDetached / startDetached).
info exec MailAccount.qml:681 opengrep · 90%
Detached process launch (Quickshell.execDetached / startDetached).
info exec MailAccount.qml:708 opengrep · 90%
Detached process launch (Quickshell.execDetached / startDetached).
info exec MailAccount.qml:712 opengrep · 90%
Detached process launch (Quickshell.execDetached / startDetached).
info exec MailAccount.qml:716 opengrep · 90%
Detached process launch (Quickshell.execDetached / startDetached).
info network MailAccount.qml:716 textscan · 100%
URL literal: https://console.cloud.google.com
info exec MailAccount.qml:720 opengrep · 90%
Detached process launch (Quickshell.execDetached / startDetached).
info exec MailAccount.qml:724 opengrep · 90%
Detached process launch (Quickshell.execDetached / startDetached).
info other Makefile:53 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other Makefile:56 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other Message.js malcontent · 60%
complex math with parseInt or fromCharCode conversions [MEDIUM]
info other Message.js malcontent · 60%
decode base64 strings [MEDIUM]
info other Message.js malcontent · 60%
assembles strings from UTF-16 code units [MEDIUM]
info other Model.js malcontent · 60%
unarchives files [MEDIUM]
info other Model.js malcontent · 60%
Run as a background daemon [MEDIUM]
info other OAuth.js malcontent · 60%
contains a client ID [MEDIUM]
info other OAuth.js malcontent · 60%
Contains HTML content [MEDIUM]
info other OAuth.js malcontent · 60%
decodes URL components [MEDIUM]
info network OAuth.js:14 textscan · 100%
URL literal: https://accounts.google.com
info network OAuth.js:15 textscan · 100%
URL literal: https://oauth2.googleapis.com
info network OAuth.js:25 textscan · 100%
URL literal: https://www.googleapis.com
info network OAuth.js:35 textscan · 100%
URL literal: http://127.0.0.1
info other README.md:6 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other README.md:32 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other README.md:39 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other README.md:52 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info other README.md:167 opengrep · 90%
Calls Omarchy commands or touches Omarchy shell state.
info filesystem README.md:167 opengrep · 90%
Writes Omarchy configuration/state.
info other scripts/body-cache.sh malcontent · 60%
executes shell [MEDIUM]
info other scripts/body-cache.sh malcontent · 60%
Forcibly deletes files recursively [MEDIUM]
info other scripts/body-cache.sh malcontent · 60%
change file timestamps [MEDIUM]
info other scripts/body-cache.sh malcontent · 60%
modifies file permissions [MEDIUM]
info other scripts/config-store.sh malcontent · 60%
executes shell [MEDIUM]
info other scripts/config-store.sh malcontent · 60%
modifies file permissions [MEDIUM]
info other scripts/google-cloud-setup.sh malcontent · 60%
Runs shell commands but throws output away [MEDIUM]
info other scripts/google-cloud-setup.sh malcontent · 60%
path reference within /dev [MEDIUM]
info network scripts/google-cloud-setup.sh:65 textscan · 100%
URL literal: https://console.cloud.google.com
info other scripts/keyring-store.sh malcontent · 60%
executes shell [MEDIUM]
info other scripts/migrate-storage.sh malcontent · 60%
executes shell [MEDIUM]
info other scripts/pkce.sh malcontent · 60%
Uses OpenSSL [MEDIUM]
info other scripts/pkce.sh malcontent · 60%
executes shell [MEDIUM]
info other Service.qml malcontent · 60%
contains a client ID [MEDIUM]
info exec Service.qml:377 opengrep · 90%
Detached process launch (Quickshell.execDetached / startDetached).
info network Service.qml:377 textscan · 100%
URL literal: https://github.com
info exec Service.qml:381 opengrep · 90%
Detached process launch (Quickshell.execDetached / startDetached).
info network Service.qml:381 textscan · 100%
URL literal: https://x.com
info exec Service.qml:436 opengrep · 90%
Quickshell Process — spawns external programs.
info exec Service.qml:462 opengrep · 90%
Quickshell Process — spawns external programs.
info exec tests/load.js:12 eslint · 60%
Found readFileSync from package "fs" with non literal argument at index 0
info other tests/test_accounts.js malcontent · 60%
contains a client ID [MEDIUM]
info other tests/test_accounts.js malcontent · 60%
references and possibly executes relative path [MEDIUM]
info other tests/test_cache.js malcontent · 60%
Detects access to sensitive files (credentials, configs, keys) [MEDIUM]
info other tests/test_cache.js malcontent · 60%
possible hidden file path [MEDIUM]
info exec tests/test_cache.js:190 eslint · 60%
Generic Object Injection Sink
info exec tests/test_cache.js:191 eslint · 60%
Function Call Object Injection Sink
info exec tests/test_cache.js:192 eslint · 60%
Generic Object Injection Sink
info exec tests/test_cache.js:227 eslint · 60%
Generic Object Injection Sink
info exec tests/test_cache.js:228 eslint · 60%
Function Call Object Injection Sink
info exec tests/test_cache.js:229 eslint · 60%
Generic Object Injection Sink
info other tests/test_credentials.js malcontent · 60%
contains a client ID [MEDIUM]
info other tests/test_credentials.js malcontent · 60%
possible hidden file path [MEDIUM]
info other tests/test_credentials.js malcontent · 60%
references and possibly executes relative path [MEDIUM]
info other tests/test_credentials.js malcontent · 60%
download files [MEDIUM]
info other tests/test_credentials.js malcontent · 60%
exchanges credentials with Google [MEDIUM]
info other tests/test_gmail_api.js malcontent · 60%
references and possibly executes relative path [MEDIUM]
info other tests/test_html.js malcontent · 60%
Detects URLs to suspicious domains often used for exfiltration or C2 [MEDIUM]
info other tests/test_html.js malcontent · 60%
hardcoded IP address [MEDIUM]
info other tests/test_html.js malcontent · 60%
Contains HTML content [MEDIUM]
info network tests/test_html.js:128 opengrep · 60%
Network address given as a raw public IP (no DNS name).
info other tests/test_install.sh malcontent · 60%
Runs shell commands but throws output away [MEDIUM]
info other tests/test_install.sh malcontent · 60%
pipes to shell [MEDIUM]
info other tests/test_install.sh malcontent · 60%
Forcibly deletes files recursively [MEDIUM]
info other tests/test_message.js malcontent · 60%
references and possibly executes relative path [MEDIUM]
info other tests/test_model.js malcontent · 60%
references and possibly executes relative path [MEDIUM]
info other tests/test_model.js malcontent · 60%
Run as a background daemon [MEDIUM]
info other tests/test_oauth.js malcontent · 60%
contains hardcoded endpoint with a question mark [MEDIUM]
info other tests/test_oauth.js malcontent · 60%
contains a client ID [MEDIUM]
info other tests/test_oauth.js malcontent · 60%
Contains HTML content [MEDIUM]
info other tests/test_oauth.js malcontent · 60%
references and possibly executes relative path [MEDIUM]
info other tests/test_oauth.js malcontent · 60%
submits content to websites [MEDIUM]
info secret tests/test_oauth.js:95 gitleaks · 70%
Possible hard-coded secret (Detected a Generic API Key, potentially exposing access to various services and sensitive operations.); value redacted, liveness not verified.

ai

escalate-only
pass 1okcontext pack, read-only
turns3
cost$0.10
pass 24findings re-checked
modelsonnet+fable
escalateno

Partial review: Gmail client plugin using Gmail API, OAuth loopback, keyring, and local cache scripts. Only BarWidget, Accounts.js, BodyCache, Cache.js and the AuthManager excerpt were reviewed; the other files were not read. No malicious behaviour seen in them.

escalate-only: the ai may add findings and raise one level; it never lowers a verdict and never clears a hard fail.