OpenLogi

Architecture

An overview of OpenLogi's components: GUI, agent, CLI, the HID++ crates, and the asset host.

OpenLogi runs as a background agent plus an on-demand GUI. The agent owns every device channel and the OS input hook; the GUI is a pure IPC client that starts the agent when it isn't already running, and the CLI talks to hardware directly for inventory and diagnostics.

Components

  • OpenLogi agent (openlogi-agent) — the background process: HID++ device I/O, the input hook, capture sessions, per-app watching, the menu-bar / tray item, pairing, and the Actions Ring overlay helper.
  • OpenLogi GUI (openlogi-gui) — a GPUI desktop app: device carousel, mouse diagram, keyboard model, action picker, and the settings windows. It holds no device state of its own.
  • OpenLogi CLI (openlogi) — headless inventory, asset sync, light and camera control, and on-device HID++ diagnostics.
  • assets.openlogi.org — a static host serving per-device renders and clickable-hotspot metadata, keyed by each device's modelId; mirrors on Cloudflare and Fastly back it up.

Crates

CrateRole
openlogi-coreTypes, TOML config, paths, and the button / action catalog; no HID, no async
openlogi-hidppVendored HID++ protocol crate (lib name hidpp): channels, features, receivers
openlogi-hidDevice discovery, HID++ reads / writes, control capture, raw-HID lights
openlogi-hookOS input hook: macOS CGEventTap, Linux evdev/uinput, Windows WH_MOUSE_LL
openlogi-injectOS event synthesis: CGEvent, uinput / MPRIS, SendInput
openlogi-cameraUVC webcam discovery, capture, and image controls
openlogi-assetsDevice-render registry schema and cached mirror fetches
openlogi-agent-coreShared orchestration plus the agent ↔ GUI IPC contract
openlogi-agent / openlogi-gui / openlogi-cliThe three binaries

How a button press becomes an action

  1. The control is captured: either by the OS hook (middle / back / forward) or diverted over HID++ 0x1b04 (gesture button, haptic panel, mode-shift, keyboard F-row) by a per-device capture session the agent rebuilds whenever bindings change.
  2. The agent resolves the binding: the frontmost app's overlay first, then the device's global map.
  3. The action runs: synthesized as OS input through openlogi-inject, written to the device over HID++ (DPI, SmartShift), or handled by the agent itself (the Actions Ring).

Configuration is a plain TOML file, read at startup and rewritten atomically on change; no cloud, no account. Values that live in volatile device RAM (DPI, SmartShift, Fn-lock, wheel resolution) are re-applied by the agent on every reconnect.

Developing without hardware

openlogi-agent-mock serves the real IPC contract from a scripted in-memory inventory, so the GUI can be developed with no Logitech device attached. See DEVELOPMENT.md.

On this page