← Back to overview

NachoRodriguezM-omarchy-google-calendar-clock low static: high → AI: low

Static high → AI refined low — see AI Review below for why (e.g., mx-ctl executable)

NachoRodriguezM/omarchy-google-calendar-clock 14cf448 Scanned 8/25/2026, 12:18:22 PM

First scan — all files are new

Score
19
Findings
5
Files
6

What this plugin does

Shows a clock in the bar (click to open month grid with ISO week numbers) and a calendar agenda below it. Events are stored locally in Caldir ICS files and synced to Google on explicit pull/push actions; users can create/edit/delete local events, view meeting links, and receive 5-minute desktop reminders.

AI Review

low

Plugin is local-first calendar with safe IPC surface and bundled helper scripts; all Process invocations use fixed literals and validated args, and external URL opening is user-initiated https-only, leaving no arbitrary code or injection surface.

Model opencode-go/muse-spark-1.2-contributor • 8/25/2026, 12:18:22 PM

How it works — sequence

sequenceDiagram
    participant User
    participant BarWidget
    participant Panel
    participant Helper as HelperScript
    participant Caldir as Caldir/Google
    participant Browser
    User->>BarWidget: click clock / IPC summon
    BarWidget->>Panel: open() / Loader Panel.qml
    Panel->>Helper: Process [helperPath("calendar-cache-read")] 
    Helper->>Caldir: read ~/.local/state/omarchy/calendar-cache.json
    Caldir-->>Panel: events + range (JSON)
    Panel-->>User: month grid + agenda dots
    User->>Panel: click JOIN
    Panel->>Browser: Qt.openUrlExternally(meetingLinks[0])
    User->>Panel: Pull/Push click
    Panel->>Helper: Process [helperPath("calendar-pull/push")]
    Helper->>Caldir: caldir pull/push + cache-update

Generated by AI from static findings + file context

Findings — AI refined (5)

BarWidget.qml:121Util.fileUrlmedium →info
benign

Constant Qt.resolvedUrl("Panel.qml") used only as Loader source for internal QML panel; not an executable and not user-controlled.

↳ Loader { source: Qt.resolvedUrl("Panel.qml") } Panel.qml:121
ℹ Not executable - QML component loading, no Process or execDetached usage
BarWidget.qml:129ipcTargethigh →low
benign

IpcHandler target "omarchy-google-calendar-clock" exposes 9 fixed no-arg functions (refresh, cycleFormat, toggleWeekStart, open/close/show/hide/toggle, refreshCalendar, calendarStatus); no payload is parsed or forwarded to shell/Process, so arbitrary IPC cannot inject args.

↳ IpcHandler { target: "omarchy-google-calendar-clock" } function refresh(): void { root.broadcast("refresh") } ... function calendarStatus(): string { return panelLoader.item.calendarStatus() } BarWidget.qml:129-145
ℹ IPC dispatch only to local UI functions; calendarStatus returns JSON, refreshCalendar triggers helperPath("calendar-cache-read") with fixed args
Panel.qml:23ipcTargethigh →info
benign

Panel declares ipcTarget but immediately sets manageIpc: false, so it registers no handler; actual IPC is handled solely by BarWidget.qml IpcHandler.

↳ Panel { ipcTarget: "omarchy-google-calendar-clock" manageIpc: false } Panel.qml:22-24
ℹ No executable - declarative IPC routing disabled on this component
Panel.qml:203Util.fileUrlmedium →low
benign

helperPath() resolves bundled scripts/ binaries via Qt.resolvedUrl("scripts/"+name); value is always used as Process.command[0] but name is only ever hardcoded literals (calendar-*) not user IPC/settings, so no path injection.

↳ helperPath("calendar-pull") -> calendarPullProcess.command = [root.helperPath("calendar-pull"), "--pending", ...] Panel.qml:803; helperPath("calendar-create"), "calendar-mutate", "calendar-push", "calendar-status", "calendar-notify", "calendar-auth-mode", "calendar-runtime-check" all literal
ℹ Locates bundled executables: calendar-cache-read, calendar-pull/push, calendar-create/mutate, calendar-status, calendar-notify, calendar-auth-mode, calendar-runtime-check; args validated (date regex YYYY-MM-DD, title newline check, repeat COUNT 2-999, Util.shellQuote for bar.run setup/uninstall)
Panel.qml:2540Qt.openUrlExternallyhigh →low
benign

Opens agendaEvent.meetingLinks[0] only on explicit JOIN button click; meetingLinks derived from CalendarModel.eventMeetingLinks which extracts only https?:// URLs via URL_PATTERN and prioritizes conference hosts, limiting to https.

↳ property var meetingLinks: CalendarModel.eventMeetingLinks(modelData) CalendarModel.js:90; Qt.openUrlExternally(agendaEvent.meetingLinks[0]) Panel.qml:2540 inside onClicked: { ... root.close() }
ℹ External URL open via system browser/xdg-open, not local command execution; URL source is calendar event conference_url/location/description, user-initiated, https-only

Process execution

  • BarWidget.qml:129IPC handler exposure — no payload validation detected (handler may accept arbitrary IPC without checks)
  • Panel.qml:23IPC handler exposure — no payload validation detected (handler may accept arbitrary IPC without checks)

Network

  • Panel.qml:2540Opens external URL

Changed files

Changed Files (31)

  • Added — .github/workflows/release.yml
  • Added — .gitignore
  • Added — BarWidget.qml
  • Added — CalendarModel.js
  • Added — LICENSE
  • Added — Model.js
  • Added — NOTICE.md
  • Added — Panel.qml
  • Added — Preview.png
  • Added — Preview2.png
  • Added — Preview3.png
  • Added — README.md
  • Added — manifest.json
  • Added — patches/caldir-google.patch
  • Added — release-assets/.gitkeep
  • Added — release-assets/v0.1.7.json
  • Added — scripts/calendar-auth-mode
  • Added — scripts/calendar-cache-read
  • Added — scripts/calendar-cache-update
  • Added — scripts/calendar-caldir
  • Added — scripts/calendar-colors
  • Added — scripts/calendar-create
  • Added — scripts/calendar-events
  • Added — scripts/calendar-mutate
  • Added — scripts/calendar-notify
  • Added — scripts/calendar-pull
  • Added — scripts/calendar-push
  • Added — scripts/calendar-runtime-check
  • Added — scripts/calendar-status
  • Added — setup
  • Added — uninstall

Commits (10)

  • 14cf448Record v0.1.7 release asset hashes by github-actions[bot] on 2026-08-21T13:53:12Z
  • 3df3fe3Fix release asset hash manifest by Ignacio Rodriguez on 2026-08-21T10:47:25-03:00
  • 20451ccRecord v0.1.7 release asset hashes by github-actions[bot] on 2026-08-21T13:44:28Z
  • 9b1f648Bind release assets to committed hashes by Ignacio Rodriguez on 2026-08-21T10:37:41-03:00
  • 917aa5fUpdate Caldir to v0.12.0 by Ignacio Rodriguez on 2026-08-20T17:58:48-03:00
  • 9cd98b2Include preview images in README by Ignacio Rodriguez on 2026-08-20T17:51:01-03:00
  • 43c34dcAdded preview image by Ignacio Rodriguez on 2026-08-20T17:50:13-03:00
  • 40bd9beAdd files via upload by Ignacio Rodriguez on 2026-08-20T17:43:54-03:00
  • 62539ceUpdate README with clearer removal instructions by Ignacio Rodriguez on 2026-08-20T17:12:45-03:00
  • ecce33fSimplify Omarchy installation guidance by Ignacio Rodriguez on 2026-08-20T10:26:58-03:00

No obfuscation detected.

Details — hidden by default

Files opened (2) — FolderListModel, StandardPaths

Files Opened (2)

Severity Category Pattern File Line Description Snippet
medium fileOps Util.fileUrl BarWidget.qml 121 Resolves file URL source: Qt.resolvedUrl("Panel.qml")
medium fileOps Util.fileUrl Panel.qml 203 Resolves file URL var url = String(Qt.resolvedUrl("scripts/" + name))
Expected imports (4) — normal for Omarchy plugins

These are expected Quickshell imports, not counted as risk.

Expected Imports (4)

Severity Category Pattern File Line Description Snippet
info imports import Quickshell BarWidget.qml 2 Expected Quickshell import — normal for Omarchy plugins (no risk) import Quickshell
info imports import qs BarWidget.qml 4 Expected local module import — normal for Omarchy plugins (no risk) import qs.Commons
info imports import Quickshell Panel.qml 3 Expected Quickshell import — normal for Omarchy plugins (no risk) import Quickshell
info imports import qs Panel.qml 5 Expected local module import — normal for Omarchy plugins (no risk) import qs.Commons
Full file tree (6 files)

File Tree (6 files)

PathTypeLinesSize
BarWidget.qml qml 187 6436
CalendarModel.js js 153 5375
Model.js js 297 10983
Panel.qml qml 2863 113094
manifest.json json 22 586
release-assets/v0.1.7.json json 10 416
Raw static findings (5) — table view

Risk-Relevant Findings (raw) (5)

Severity Category Pattern File Line Description Snippet
medium fileOps Util.fileUrl BarWidget.qml 121 Resolves file URL source: Qt.resolvedUrl("Panel.qml")
high ipc ipcTarget BarWidget.qml 129 IPC handler exposure — no payload validation detected (handler may accept arbitrary IPC without checks) IpcHandler {
high ipc ipcTarget Panel.qml 23 IPC handler exposure — no payload validation detected (handler may accept arbitrary IPC without checks) ipcTarget: "omarchy-google-calendar-clock"
medium fileOps Util.fileUrl Panel.qml 203 Resolves file URL var url = String(Qt.resolvedUrl("scripts/" + name))
high network Qt.openUrlExternally Panel.qml 2540 Opens external URL Qt.openUrlExternally(agendaEvent.meetingLinks[0])

Generated by omarchy-audit at 2026-08-25T10:18:22.890Z • Commit 14cf448 linked to GitHub for verification • Overview