View and control your Home Assistant devices from the Omarchy bar.

Quickshell plugin for Omarchy 4. Pick the devices and toggle lights, adjust climate, drive media, and open covers.

Not affiliated with or endorsed by the Home Assistant project.

Screenshots

Tokyo Night Catppuccin Latte
Home Assistant panel in demo mode using the Tokyo Night theme Home Assistant panel in demo mode using the Catppuccin Latte theme
Solitude Nord
Home Assistant panel in demo mode using the Solitude theme Home Assistant panel in demo mode using the Nord theme

Home Assistant demo device list and panel favorites using the Solitude theme

Keyboard

With the panel open, j/k or / traverse device rows and their expanded controls. Inside expanded controls, / move between selectors; otherwise they switch area tabs. enter activates the selected row or opens the selected dropdown. e expands its controls, s opens settings, r refreshes, esc closes, and tab moves to the next bar panel.

What you can control

Domain Control
light On/off, plus a brightness slider when the light is dimmable, colour swatches with hue and saturation when it renders colour, and a warmth slider when it does colour temperature
switch, fan, input_boolean, humidifier On/off
lock Lock/unlock switch
scene, script Activate button
media_player Previous / play-pause / next, volume slider
cover Open / stop / close
climate On/off when advertised, plus HVAC, fan, preset, swing, and target-temperature or low/high-band controls when advertised
sensor, binary_sensor, everything else State display only

Cameras not yet.

Scripting

The panel is reachable over the shell's IPC, so a device can go on a keybind:

omarchy-shell hass toggleEntity light.desk
omarchy-shell hass activate scene.movie_night
omarchy-shell hass expand climate.hallway   # opens the panel, unfolded
omarchy-shell hass favorite light.desk      # add to / remove from the panel
omarchy-shell hass status
omarchy-shell hass settings             # connection settings
omarchy-shell hass devices              # device picker

Requirements

  • Omarchy 4 (schemaVersion: 1 plugin API)
  • Python 3.11 or newer
  • secret-tool (libsecret) with a running keyring daemon
  • nmcli (NetworkManager), only if you use a local network URL

The pure-Python runtime of websockets 17.0.1 is bundled with the plugin and loaded from vendor/. Users don't need python-websockets, qt6-websockets, pip, a virtual environment, or a first-run download.

Install

omarchy plugin add https://github.com/konradk/hass.git --enable

For local development, symlink the checkout instead:

ln -sfn "$PWD" ~/.config/omarchy/plugins/hass
omarchy restart shell
omarchy plugin enable hass

Setup

Click the gear in the panel header, or press s with the panel open. From a terminal: omarchy-shell hass settings, or omarchy-shell hass devices to open device picker.

Paste your Home Assistant URL and a long-lived access token (Home Assistant → your profile → Security), or flip on Demo mode to try the panel against a built-in fake house with no instance at all. Then switch to Devices and star the ones you want in the panel.

Optionally, turn on Local network URL to add your instance's LAN address. It's the same Home Assistant instance reached by a different address, so it reuses the one access token above rather than needing its own. It also asks for the name of your trusted Wi-Fi network (comma-separate more than one, for example if your router has separate 2.4GHz/5GHz names): the local URL is only ever tried while connected to one of those, and the URL above is used everywhere else. If that field is empty, it'll offer the network you're currently on as a one-click suggestion. This matters because the local URL is plaintext-friendly on the assumption that your home network is trustworthy — without the network-name check, a laptop that later joins some other Wi-Fi with something answering on that same address would send it your token.

Debugging

omarchy-shell hass status     # what the widget sees
omarchy-shell hass toggle     # open/close the panel
omarchy plugin validate .     # check the manifest before committing

Tests

python3 tests/test_bridge.py     # bridge, against a fake Home Assistant
python3 tests/test_vendor.py     # pinned dependency, license and offline import
python3 tests/test_service_contract.py
node    tests/test_connection.js # URL/origin and generation rules
node    tests/test_config.js     # config normalization and secret exclusion
node    tests/test_store.js      # state and registry projections
node    tests/test_model.js      # entity formatting and classification
node    tests/test_row_model.js  # ListModel row projection
python3 tests/test_qml_style.py  # UI house style (fonts, palette, tokens)

Security

Your long-lived access token is stored in the system keyring via secret-tool. Use an https:// Home Assistant URL whenever possible. If you explicitly use http://, the token is sent without transport encryption; reserve that for a trusted local network where you understand the risk.

When the checkout is symlinked for local development, runtime settings are written to config.json in the checkout. That file is ignored because it can contain private instance URLs, area names, entity IDs, and display-name overrides. The access token is never stored there.

Bundled dependency maintenance

websockets 17.0.1 is redistributed under BSD-3-Clause; provenance, the sdist SHA-256 and omitted files are recorded in vendor/README.md, with legal notices in THIRD_PARTY_NOTICES.md.