Omahub
← All plugins
H

OmaSafe

by Hung Vo

Inspect installed plugins and review GitHub candidates for source drift, capabilities, rule coverage, and scan alerts.

Security review

No obvious issues detected

Deterministic scan — not a security guarantee

None
Risk level
None
Analyzed commit
321b11a
Scanned
2 weeks ago

No potentially dangerous behavior detected in the analyzed commit.

Automated analysis only — not a security guarantee.

AI advisory review

No obvious issues detected

Language-model assessment · ~deepseek/deepseek-v4-flash-latest — advisory only

Low
AI risk level
Low
Recommendation
install
Model
~deepseek/deepseek-v4-flash-latest
Analyzed commit
321b11a
Reviewed
2 weeks ago

The sampled source is transparent, well-structured, and consistent with the documented behavior: a QML dashboard that invokes the separate omasafe-cli binary for scans and reports, with no obfuscation, destructive install actions, or credential handling. The main residual risk is that the widget runs unsandboxed and executes whatever omasafe-cli is found on PATH, so the CLI binary itself must be trusted.

  • The plugin executes an external omasafe-cli binary from PATH and only checks its version string, not its authenticity; a tampered or malicious omasafe-cli on PATH would run with the user's privileges.
  • As with any Omarchy plugin, the QML runs unsandboxed inside omarchy-shell; the code is readable and appears safe, but the trust chain includes the separately installed CLI, not just this repository.
How this check works

This review combines the deterministic scan (the rule-based results above) with an independent look at the plugin's code by a language model. The model reads a trimmed sample of the repository's files, the manifest, and the README, then gives a plain-language risk level and a recommendation: install (no notable danger), review (look closer first), or avoid (clearly dangerous).

It runs on the same analyzed commit as the deterministic scan and is strictly advisory — it is not a security guarantee and never blocks a plugin by itself. A human moderator still reviews plugins before they are listed.

AI advisory only — automated analysis, not a security guarantee.

Install
$ omarchy plugin add https://github.com/tuthan/omasafe-plugin --enable
System #bar #security
<p align="center"> <img src="media/logo.png" alt="OmaSafe" width="520"> </p>

OmaSafe Omarchy plugin

Know what your system can do. Catch what quietly changed.

OmaSafe is an Omarchy bar widget and review panel over two subjects: the plugins installed on this machine, and the machine itself. It surfaces source drift, detected capabilities, rule coverage, scan alerts, trust baselines, marketplace metadata, and host posture. The separate omasafe-cli binary owns identity, analysis, and report state; this plugin renders its reports and does not declare plugins or hosts safe.

The panel also reviews public GitHub candidates before installation through the CLI's scan-only route. It shows the resolved commit, findings, capabilities, and coverage limitations without installing or enabling the candidate.

The plugin runs as unsandboxed QML inside omarchy-shell, so review the source before enabling it. Installing the plugin and installing the CLI are separate operations.

Omasafe plugin preview

Analysis graph

Analysis graph showing a plugin, capabilities, rules, and Baseline V3

Host posture

Host posture: a check strip, state counts, a coverage sentence and a tools line, then the three checks needing attention above the observed list

Source scan result

Source scan result band: a severity meter, findings by rule, a capability strip and a coverage meter, each with its exact counts printed beneath

What the panel shows

The panel has five views over two subjects — the plugins installed on this machine, and the machine itself:

View Purpose
Plugins Plugin inventory, trust baseline state, scan alerts, and marketplace claims.
Analysis Matrix, graph, trace, detected capabilities, linked rules, and Baseline V3 coverage.
Rules Rule catalog, local hits, and Baseline V3 coverage relations.
Posture Host posture report, coverage state, update awareness, and post-update hook observation.
Source Scan Manual pre-install scan of a public GitHub URL or copied install command.

The Plugins and Posture chips carry a count in parentheses so you can see which tab has something in it without visiting all five: a digit when the collector ran and found items, · when it ran and found none, – when it has not run or is unavailable. A chip with no count is a tab with no collector, never a clean tab, and each chip's tooltip says in words what its count means.

Analysis counts are evidence, not permissions or scores. A capability “use” is one source-level reference emitted by the analyzer; the file count is the number of distinct files containing those references.

Installed analysis results are persisted by the CLI in its private XDG cache and restored through bounded cache-only requests when the panel opens after a shell restart. The overview can therefore recover analysis counts, while the panel still validates the plugin source identity, analyzer policy, and suppression configuration before using a saved result. An explicit Analyze action refreshes it; a cache miss keeps the honest “Not analyzed” state.

Status markers are shared across the views:

  • Green check: a current scan has no active alerts, or a fully analyzed rule has no local hits.
  • Yellow: medium or warning severity.
  • Amber: high severity.
  • Red: critical, error, or blocked.
  • Gray: stale or unavailable data. Incomplete coverage is amber and remains visibly non-passing.

Markers always retain the corresponding word or glyph and never represent a safety verdict. Cached results are explicitly labeled stale.

Charts

Where the panel draws a chart it is a shape aid attached to printed numbers, never a substitute for them. Every chart prints each category's exact count immediately beside it; delete the chart and you lose reading speed, never information. Only cell position in a fixed order and segment length on a common baseline are used — no pie, no gauge, no heatmap, no sparkline — and no chart is titled with a judgement, has a target line, or shows an aggregate. Segment counts always sum to the printed total, including the omitted and zero terms.

OmaSafe does not draw a score, index, grade or percentage-healthy for the host, for a plugin or for a candidate. A number that summarises safety in one figure is the thing this panel exists not to produce.

Placeholders

One set, in every view:

Mark Meaning
a digit the observed count
· analyzed, and none observed
– not analyzed, or analyzed with completeness not established
unavailable the word, when a collection could not be read

· is a positive claim and has to be earned. Where the scanner omitted entries or a display cap hid them, cells that would read · render – instead and the section header says PARTIAL — on a candidate and on an installed plugin alike.

Keyboard shortcuts

Key Action
↑ ↓ / j k Move within a list or graph column.
← → / h l Move across view chips, graph columns, the posture check strip, or a row of copy actions.
Enter Open a plugin, pin a graph node, follow a link, expand a posture check or a scan finding, or jump from a strip cell to its check.
Esc Go back, close a confirmation sheet, or close the panel.
r Run a scan.
4 Open the Posture tab.
5 Open the Source Scan tab.
a / A Analyze the selected plugin / all plugins.
m Toggle the Analysis lens between Matrix and Graph.
t Trace a plugin and capability class.
g Expand or compact the panel.
x Unpin a graph node or cancel a running analysis sweep.
? Show the Analysis legend.
/ Find a plugin, capability class, rule, Baseline id, posture check or scan finding.

Requirements

  • Omarchy with shell plugin support.
  • omasafe-cli 0.3.2 or newer on the graphical session PATH.

The widget can be installed before the CLI. Until the CLI is available, it shows an unavailable state and never implies that the system is clean.

Host Posture

The Posture tab reads the CLI's omasafe.posture.v1 report. It opens on a summary band and puts the checks worth acting on above everything else.

The summary band. One cell per check, in the CLI's catalog order, so a cell position means the same check on every host and every run. Beneath it, three lines that answer three different questions:

HOST POSTURE                                     CATALOG V1 · 18 CHECKS
  i  v  v  i  %  i  v  v  i  i  _  v  i  _  v  i  !  %
  0 error · 1 regression · 2 incomplete · 0 attention · 7 informational ·
  6 pass · 2 not applicable
  Observation completed for 14 of 18 checks. 2 incomplete, 2 not applicable.
  Report 12 hours old · x86_64 7.1.9-arch1-2 · Omarchy 4.0.2-1
  Tools 11 of 12 observed · arch-audit unavailable, 1 check incomplete

The counts line is the state axis and prints every state's exact count, including its zeros. The sentence below it is the observation axis: "completed" means the check could be observed, not that it passed — it includes the regression. The tools line names the missing tool and its consequence, so a coverage gap arrives with its cause instead of unexplained.

The body. NEEDS ATTENTION comes first — every error, regression, incomplete and attention check, expanded, with its evidence, its coverage limitation labelled Not observed, and its next step. OBSERVED follows, grouped by the domain prefix of the check id, one collapsed line per check carrying a fact drawn from its first evidence string. Enter expands a check or collapses a domain.

Where a next step names a command, a Copy command button copies exactly the command the report printed. OmaSafe never runs it and never invents one.

Keyboard. j/k walk the tab, h/l walk the check strip and the copy actions, Enter on a strip cell jumps to that check and expands it, and / finds a check by id, title, state, evidence, limitation or next step.

The panel opens with the last completed posture report. Use Run posture scan (or press r) to collect a current report after an Omarchy or package update. The first export may say not yet run; that is an absence of observation, not a clean result. The CLI owns the report, state history, and optional notification behavior; the panel only renders the bounded result. It shows report age and marks observations older than 24 hours as stale.

The Posture tab chip carries the size of the NEEDS ATTENTION set: a digit when there is something to look at, · when a scan ran and found nothing, – when no scan has run or the CLI is unavailable. It is a count of items to look at, never a score. The bar's shield tooltip carries the same sentence once a report has arrived. The compact bar count remains the plugin-alert surface until the planned M7 bar indicator is implemented.

Plugin Source Scan

Open the Source Scan tab and paste either a public GitHub repository URL or one plain omarchy plugin add|install URL [--enable] [--yes] command. The input is passed to omasafe-cli as one argv value; the CLI owns parsing, resolves the moving request to one exact commit, and returns an immutable scan-only report. The panel displays the resolved repository, full commit, acquisition facts, findings, capabilities, coverage limitations, and a copyable exact-commit rescan command. When the complete findings list has no high or critical item, it also shows a suggested omarchy plugin add|install command for manual review and copying.

The result band sits above the install command and above the findings, so the first thing read is the distribution and not an action:

FINDINGS                                                              32
[################################################################]
0 critical · 0 high · 31 medium · 1 low · 0 info
32 shown · 0 omitted by the scanner · 0 hidden by the display cap · 0 suppressed

BY RULE                                                                2
oma.qml.out-of-tree-reference   [############################]        31
oma.qml.dynamic-reference       [#]                                    1

CAPABILITIES              63 uses · 4 classes · 3 files
PX  ·  FS  ·  ·  ·  ·  TM  CB  ·  ·  ·  ·  ·  ·  ·  ·
persistence scheduling 39 · process execution 20 · clipboard access 3 ·
filesystem access 1

COVERAGE                                    PARTIAL · 49 PAYLOAD ENTRIES
[##### analyzed 21 #####][#][######## unsupported 11 ##########][unref 16]
21 analyzed · 1 partial · 0 truncated · 0 skipped · 11 unsupported ·
16 unreferenced

BY RULE turns "32 findings" into "one rule, 31 times", which is a different review. The capability strip uses the same 17 catalog positions an installed plugin shows, so the two can be compared at a glance. COVERAGE makes "21 of 49 payload entries analysed" the second thing you see rather than the last, and no segment of it is ever "done" green.

Every chart prints its exact counts immediately beneath it; delete the chart and you lose speed, never information.

Reconciliation. Each collection prints one arithmetic line that always adds up — n shown · n omitted by the scanner · n hidden by the display cap — whether or not anything was omitted. A single notice is raised when any term is non-zero, naming every one of them. A summary whose parts only sometimes add up stops being read.

Where completeness is not established, the panel says so. If the scanner omitted capability entries or the display capped them, every unobserved strip position renders – rather than ·, the header reads CAPABILITIES · PARTIAL, and the derived counts are prefixed at least. · means "we looked and there was nothing", which is a positive claim; a count that could be short has not earned it. The same rule now governs the installed capability strip, the Matrix grid and the Rules green check.

Keyboard. j/k walk the findings, Enter expands one, h/l walk the copy actions, and / finds a finding by rule id, title or path.

Plugin Source Scan never installs, enables, trusts, suppresses, overrides, schedules, or approves the candidate. Archive and registry inputs are not accepted by this route. A compact review report can omit entries or analysis items, so an empty displayed list is not a safety conclusion when omission markers are present; in that case the suggested install command stays hidden.

Install the CLI

Download the matching release archive and checksum from the OmaSafe releases page, verify it, and install the binary somewhere visible to the graphical session:

sha256sum --check omasafe-cli-VERSION-x86_64-linux.tar.gz.sha256
tar -xzf omasafe-cli-VERSION-x86_64-linux.tar.gz
install -Dm755 omasafe-cli-VERSION-x86_64-linux/omasafe-cli \
  "$HOME/.local/bin/omasafe-cli"

Verify the dependency:

command -v omasafe-cli
omasafe-cli --version
omasafe-cli scan --format json

Before running scans or trust actions, the plugin checks that the CLI exits successfully and reports a compatible version. The minimum version and an optional identity check can be configured in the plugin settings.

Install the plugin

Install from the marketplace or the published repository:

omarchy plugin add https://github.com/tuthan/omasafe-plugin.git --enable

The marketplace does not install omasafe-cli. After installing the CLI, refresh the running shell if needed:

omarchy-shell shell rescanPlugins
omarchy plugin enable io.github.tuthan.omasafe --section right

Scan behavior and cache

Periodic scanning is disabled by default. Enable it in the widget settings and choose an interval from 1 to 1440 minutes, or run scans manually.

After a successful scan, the CLI stores a small normalized snapshot at:

${XDG_CACHE_HOME:-$HOME/.cache}/omasafe/scan-snapshots/installed-analysis.json

The advisory scan profile writes installed-basic.json; --include-analysis and the widget write installed-analysis.json. The CLI owns these files and the widget reads them only through omasafe-cli scan-cache show; QML never walks or writes the cache directory. Snapshots contain normalized alert and enforcement metadata only, never raw stdout, stderr, or full analysis payloads. After a shell restart, matching cached data is shown explicitly as cached and stale/unvalidated until the bounded validation command confirms its context.

Cache deletion is safe and removes only startup hydration data. It never removes trust baselines, review decisions, enforcement history, or notification state:

rm -rf -- "${XDG_CACHE_HOME:-$HOME/.cache}/omasafe/scan-snapshots"

The cache is private to the user (0700 directory, 0600 files) and is recreated by the CLI on the next successful scan. A stale or cached quiet result is historical evidence, not a safety verdict.

Marketplace data

For listed plugins, the panel displays marketplace claims separately from local trust state. It can show snapshot integrity, listing verification, installed commit comparison, and upstream movement. “Verified” is always attributed to the marketplace snapshot and is never an OmaSafe safety judgment.

Local development

Omarchy expects a real plugin directory, so use rsync instead of a symlink:

plugin_dir="$HOME/.config/omarchy/plugins/io.github.tuthan.omasafe"
mkdir -p "$(dirname "$plugin_dir")"
mkdir -p "$plugin_dir"
rsync -a --delete --exclude='.git/' ./ "$plugin_dir"/
omarchy-shell shell rescanPlugins
omarchy plugin enable io.github.tuthan.omasafe --section right

After changing BarWidget.qml, Panel.qml, or manifest.json, run the same rsync command and rescan the shell. Do not use omarchy plugin update for this local copy.

Disable or remove

omarchy plugin disable io.github.tuthan.omasafe
omarchy plugin remove io.github.tuthan.omasafe

Removing the plugin does not remove the independently installed CLI.

Validate locally

omarchy plugin validate .
qmllint -I /usr/share/omarchy/shell -I /usr/lib/qt6/qml \
  BarWidget.qml Panel.qml components/*.qml views/*.qml graph/*.qml
node scripts/flow-test.js
node scripts/cli-floor-test.js