* Add pulsar-mouse plugin
Battery/charging status and quick sensor/lighting/power controls for a
Pulsar gaming mouse (bar widget, desktop/lock-screen widget, and a
quick-controls panel), backed by the pulsar-mouse CLI from
https://github.com/harveywuk/pulsar-mouse-linux.
* pulsar-mouse: sync to v1.6.1 (three panel fixes)
The plugin picked up four commits upstream after this PR's initial
snapshot was taken. Three of them are bug fixes, two user-facing enough
that installing the current snapshot gives a visibly broken panel:
- Panel went permanently read-only after a successful profile switch.
Every control is `enabled = not busy`, and the profile-switch path set
busy = true then relied on readStatus() to clear it, which it did not
do on any path. No error was shown, because from the user's point of
view nothing had failed.
- readStatus() did not guard decoded.dpi being absent, so a malformed
response threw before clearing busy - the same lockup by another route.
- The panel only re-synced to the mouse's real active profile on the
first open of the process, because the profileSynced flag is module-
scoped and survived the panel closing. Switching profiles by any other
means afterwards (physical profile button, `pulsar-mouse
--active-profile`, Fusion on another OS) left every later reopen
showing, and writing to, a stale profile.
The fourth renames "breath" to "breathe" so the LED effect naming
matches the pulsar-mouse CLI's --breathe-speed flag; that accounts for
the two README wording changes and part of the panel diff.
plugin.toml's version goes 1.6.0 -> 1.6.1 per the contribution rules
(patch: fixes and text only, no new capability). Its header comment also
now describes the tabbed panel that shipped earlier rather than the
original DPI/polling-only one.
bar.luau, desktop.luau, translations/en.json and thumbnail.webp are
unchanged and untouched.
No change to what the plugin shells out to, writes, or reads: still only
`pulsar-mouse` (declared in dependencies), still only reading
~/.cache/pulsar-mouse/battery.json. No network access.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Addresses the three non-blocking notes from #292:
- README's plugin_api requirement was stale (22) vs the manifest's real
minimum (17, the onExit lifecycle addition) — corrected, and pinned the
noctalia version floor to beta.7 (the first tagged release plugin_api
actually reaches 17 in).
- apply()'s privilege path ran the whole discovery+mutate script through
`priv sh -c '...'`, which the documented sudoers rule (NOPASSWD:
/usr/bin/nmcli) never covers — sudo -n always failed. Now the privilege
prefix is applied to each of the two mutating nmcli calls individually,
never to a wrapping shell.
- Regenerated thumbnail.webp.
Co-authored-by: nightwatch75 <nightwatch75@users.noreply.github.com>
* Add procmon plugin with live process panel
New Noctalia plugin: bar widget shows CPU/RAM usage and process
count; floating panel has a sortable, searchable process table
with per-process kill. Background service samples ps and /proc
stats and publishes via plugin state.
* Throttle data-driven panel renders
Rebuild table at most every 500ms to stay within the panel update
CPU budget. User interactions still render immediately; only state
watches and the tick go through maybeRender().
* Update procmon deps and fix timestamp precision
Document head, grep, and cat as required commands. Correct refresh
interval default to 1000 ms. Sample refreshedAtMs in milliseconds.
* Add 9Router panel plugin
This commit introduces the initial version of the 9Router panel plugin.
It provides a Noctalia panel to manage 9Router model combos directly
from the bar, without requiring the web dashboard.
Key features:
- List, create, rename, and delete model combos.
- Reorder models within a combo via drag-and-drop.
- Change combo routing kind (fallback, round-robin, fusion).
- Search and filter combos.
- Supports 9Router dashboard authentication via CLI token or password.
Includes a bar widget showing connection status, a full UI panel,
and a background service to interact with the 9Router REST API.
Translations for English and Vietnamese are included.
* Rename 9Router Panel to 9Router Control
Update plugin IDs, IPC commands, and internal references.
* Quote shell args in service commands
Add shell_quote() for URLs, bodies, and file paths passed to
noctalia.runAsync. Declare required external commands in plugin.toml
and document them in the README.
* Add Quick Shell plugin for launcher commands
Introduces `/qs` launcher prefix to run shell commands in an interactive
terminal. Features dynamic shell completions (Fish/Bash), command
history, user snippets, and directory navigation.
* Rename quick-shell plugin to shell command plugin
* Update thumbnail.webp
* Document shell dependencies and filter completions by current word
Filter bash compgen completions to the current word being typed. Declare
`sh`, `ls`, `fish`, and `bash` as plugin dependencies.
Switch the system DNS between popular providers, custom servers, or the ISP
default, from a panel on the bar — no reconnect, no captive-portal re-run.
Detection reads the active connection's own ipv4.dns/ipv4.ignore-auto-dns
instead of guessing, so a manually configured resolver (LAN ones included)
shows as its provider and DHCP-assigned DNS shows as Default (ISP). A
singleton service entry owns detection/apply so multiple bars share one
engine.
Every bar gesture (left/right/scroll) is a manifest [widget.actions] default,
resolved through noctalia's own IPC registry, so any of them can be remapped
from the bar's own gesture settings without touching the plugin. The panel
also carries a DNS lookup tester: resolve a name against the active
provider's own address with dig/nslookup, to confirm a switch took effect or
that a provider blocks a domain.
Co-authored-by: nightwatch75 <nightwatch75@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
* fix(arch-updater): tighten package list spacing and icon size
* fix(arch-updater): make Dismiss actually clear the pending list
* fix(arch-updater): make hitting update close the panel
* feat(arch-updater): add per-source icons to the package list header
* feat(arch-updater): add an activity graph to the panel
Tracks the pending-update count across recent checks and when the last
update ran, persisted to disk so it survives restarts. Off also stops
recording history, not just hiding it.
* feat(arch-updater): show per-point detail on activity graph hover
ui.graph has no pointer props of its own, so a row of ghost buttons
sits under the line as per-point hit targets, each with a native
tooltip. History entries now carry a timestamp and whether the check
followed an update run, so hovering a point says when it happened and
either its pending count or "Updated".
* fix(arch-updater): load activity history at startup, not on first check
loadHistoryState() only ran lazily inside recordCheck/recordUpdateRun,
so a freshly started service published an empty history until a check
completed, hiding the graph even when prior sessions had data on disk.
* fix(arch-updater): render activity graph with sharp points, not curves