Skip to content

Lua Widgets & Packages in EasyBar Native

Lua is the public widget extension model for EasyBar Native. The same EasyBarKit node, event, command, storage, popup, context-menu, and package contracts are used by the full EasyBar frontend.

Install a package

Search the shared registry:

easybar-native widgets search

Install into Native's isolated package store:

easybar-native widgets install tailscale
easybar-native config reload

The active package root is:

~/.local/share/easybar-native/packages/active/

This is intentionally different from EasyBar's ~/.local/share/easybar/packages/active/.

Manual widgets

Put hand-written Lua files below:

~/.config/easybar-native/widgets/

The same discovery and shared/ module rules described in Lua Widgets apply.

Presentation rules

Each top-level Lua root becomes one macOS status item. Child nodes, groups, popups, and interactions remain part of that root's rendered content.

position and order still produce deterministic relative ordering, but macOS ultimately owns the system status area. EasyBar Native cannot provide the full-width left/center/right geometry of the EasyBar frontend.

Frontend capability differences

The Lua API surface is shared, but not every host data source exists in every frontend. EasyBar Native does not provide the EasyBar Calendar or Network agents, so agent-backed events such as calendar_change, wifi_change, and network_change should not be the only refresh mechanism for a Native-targeted widget. Prefer portable triggers such as forced, intervals, wake events, or direct command integration when the data source can be queried without an EasyBar agent.

A package can still be installed in Native when it degrades gracefully without an EasyBar-only capability. Package documentation should call out any functionality that is specific to one frontend.

Host-owned Inbox

Inbox is the one host-owned built-in surface intentionally available in Native. Inbox publisher packages do not create a second status icon for their source; they publish into the shared Inbox surface.

For example:

easybar-native widgets install inbox-github
easybar-native widgets install inbox-gitlab
easybar-native widgets install inbox-brew

The packages and Inbox state remain Native-local because the package root and runtime directory are Native-local.

Portability

Package manifests target minimum_easybar_kit_version, not a specific frontend executable. A package is generally portable between EasyBar and EasyBar Native when it only uses the shared Lua contract. A package that assumes an EasyBar-only built-in or agent-backed capability should document that frontend requirement explicitly.