Workflow & Publishing
Local development
Section titled “Local development”Drop your plugin under $XDG_DATA_HOME/noctalia/plugins/<plugin>/ (or add a path source pointing at your dev
directory), then enable it once. Edits to .luau files hot-reload automatically; manifest changes are picked up on the
next config reload. Drive an entry’s onIpc handler from the shell to test:
# A bar widget - target a specific output (focused / connector / a-bar-name) or all:noctalia msg plugin me/hello:hello focused greet "hi there"
# A service - it is a singleton with no output, so address it with the `all` target:noctalia msg plugin me/hello:ticker all refresh
# A panel - toggle by full entry id:noctalia msg panel-toggle me/hello:panelThe target picks which live instances receive the event: focused (the focused output), a connector or
<connector>:<bar-name>, or all. Services and other non-bar entries have no output, so they only match all.
Publishing
Section titled “Publishing”Plugins are distributed from source repos - one repo holds many plugins, each in its own subdirectory matching the
part of the id after the / (so me/hello lives at hello/). Add a catalog.toml at the repo root indexing every
plugin so it can be listed and compat-checked without a full clone:
[[plugin]]id = "me/hello"name = "Hello"version = "1.0.0"author = "me"license = "MIT"icon = "puzzle"description = "A friendly greeter."deprecated = falsemin_noctalia = "5.0.0"tags = ["demo"]dependencies = ["slurp"]Catalog rows require id and name; rows without either are ignored.
Users add your repo with noctalia msg plugins source add <name> git <url>, then enable plugins from it. To contribute
to the official catalog, open a PR against
official-plugins.