EasyBar is a lightweight, scriptable macOS status bar built with SwiftUI and Lua.
It combines native built-in widgets with custom Lua widgets and is designed for an AeroSpace-based macOS workflow.
- Native macOS bar window built with SwiftUI
- Built-in widgets plus scriptable Lua widgets
- File-based themes with bundled and custom TOML palettes
- AeroSpace integration for spaces, focused app state, and layout mode state
- Event-driven updates and interactive popups
- Calendar and network helper agents
- Homebrew install and service workflow
- Config-driven logging and troubleshooting support
- Lightweight runtime metrics
brew tap gi8lino/tap
brew install gi8lino/tap/easybarStart EasyBar and its helper agents:
brew services start gi8lino/tap/easybar-calendar-agent
brew services start gi8lino/tap/easybar-network-agent
brew services start gi8lino/tap/easybarFull documentation is available here: https://gi8lino.github.io/easybar/
Start with:
- Installation
- Configuration
- Themes
- AeroSpace Integration
- Lua Widgets
- Runtime Control
- Troubleshooting
- Architecture
EasyBar reads its runtime config from:
~/.config/easybar/config.toml
You can override it with:
EASYBAR_CONFIG_PATH=/path/to/config.tomlThe repository includes:
Themes are selected in config.toml:
[theme]
name = "default"
themes_dir = "~/.config/easybar/themes"EasyBar first looks for a custom theme in themes_dir, then falls back to bundled themes.
Quickstart for contributors:
make test
make stop
make run-debugUseful build and runtime commands:
make testruns the full Swift test suite.make buildbuilds the local app, agents, and CLI artifacts.make run-debugstarts EasyBar with verbose logging for local debugging.make stopstops the running EasyBar app and helper agents cleanly.make validate-config CONFIG=/path/to/config.tomlbuilds the CLI and asks EasyBar to dry-run config validation without reloading the bar.
Regenerate checked-in generated files before committing changes to theme tokens, event catalog data, Lua API stubs, or generated Lua reference docs:
make generateRegenerate only generated documentation when the runtime or Lua API docs changed:
make generate-docsBefore opening a pull request, verify that generated files are current:
make check-generatedReusable automation lives under scripts/ and is grouped by purpose:
scripts/ci/contains CI-only wrappers such as dependency setup and long-running Swift test logging.scripts/release/contains release automation such as Homebrew formula rendering and tap commits.- Existing generator scripts remain the source of truth for generated Swift, Lua, and documentation artifacts and are still orchestrated through the Makefile.
Keep local developer entrypoints in the Makefile where possible, and move only reusable implementation details into scripts. That keeps commands like make generate, make build-docs, and make package stable while avoiding large shell blocks in workflows.
Helpful entry points in the codebase:
Sources/EasyBarApp/Appcontains the main app shell and startup wiring.Sources/EasyBarApp/Runtimecontains config reload, file watching, and socket orchestration.Sources/EasyBarApp/Widgetscontains native widgets, Lua runtime integration, and rendered widget state.Sources/EasyBarCalendarAgentandSources/EasyBarNetworkAgentcontain the helper agent apps.Sources/EasyBarSharedcontains shared runtime, logging, socket, and protocol code used across targets.
If you want the architectural map before editing code, start with the docs sections for Architecture, Agents, and Lua Runtime in the project docs.
This project is licensed under the Apache 2.0 License. See LICENSE for details.






