AprilNEA/OpenLogi
73.4
Strong · 28 September 2026
143.9k
lines of production code
Rust
primary language
2
measurements over time
What this system is
OpenLogi is a cross-platform configuration suite for Logitech peripherals, consisting of a background daemon, a desktop settings application, and a command-line interface. The system manages device identity, HID++ protocol communication, and input interception to enable granular control over buttons, DPI, lighting, and camera settings. It supports per-application profiles, an interactive 'Actions Ring' menu, and provides diagnostic tools for hardware validation and privacy-safe fixture recording.
Features
Add Crown feature event decoding and mode parsing
The HID++ Crown feature (0x4600) now exposes structured events for rotation, proximity, touch, gestures, and button states via the new \CrownEvent\ and \CrownUpdate\ types. Users can now parse crown mode configurations and handle real-time input updates, with robust handling for unknown enum values that preserves valid sibling fields instead of dropping the entire event.
crates/openlogi-hidpp/src/feature/crown · high confidence
Add GNOME Shell extension for Wayland frontmost-window detection
Users on GNOME Wayland can now install the \openlogi-frontmost\ GNOME Shell extension to enable per-app mouse profile switching. The extension exports the focused window's WM\_CLASS over D-Bus, allowing the OpenLogi hook to identify the active application without polling, which is otherwise restricted on Wayland.
crates/openlogi-hook/src · high confidence
Add HID++ Color Led Effects feature support
This change introduces the \ColorLedEffects\ feature (HID++ ID 0x8070) to the HID++ protocol implementation. It adds the necessary domain types, event decoding, and unit tests to parse and interact with color LED effects, including support for effect IDs (e.g., FixedColor, ColorWave, Ripple), zone information, RGB color settings, and synchronization events.
_crates/openlogi-hidpp/src/feature/color\_led\effects · high confidence
Add HID++ Illumination feature support for backlight control
The \openlogi-hidpp\ crate now includes the Illumination feature (0x1990), enabling applications to query and configure device backlight settings. Users can retrieve control capabilities (such as linear or non-linear level support) and ranges, set brightness and color temperature levels via linear or explicit non-linear configurations, and receive real-time events for state changes, including illumination on/off, brightness adjustments, color temperature shifts, and clamping notifications when requests exceed effective maximums.
crates/openlogi-hidpp/src/feature/illumination · high confidence
Add Linux desktop entry for OpenLogi
A new desktop entry file has been added to package the application as 'OpenLogi' on Linux systems. This entry configures the application to launch via the 'openlogi-desktop' executable and sets the window class to 'org.openlogi.openlogi', ensuring proper integration with desktop environments like GNOME for icon grouping and window management.
packaging/linux/desktop · high confidence
Add RGB Effects feature support for Logitech HID++ devices
This change introduces the \RgbEffects\ feature (HID++ ID 0x8071), enabling software control over per-cluster and per-key RGB lighting effects. Users can now manage RGB power modes, configure effect persistence (volatile vs. non-volatile storage), and receive real-time events for effect synchronization and user activity. The implementation includes type definitions for device capabilities, cluster information, and effect parameters, along with event decoding for sync, activity, and cluster change notifications.
_crates/openlogi-hidpp/src/feature/rgb\effects · high confidence
Add per-application Actions Ring editor and profile management
Users can now configure the Actions Ring on a per-application basis. A new editor panel allows selecting actions for each of the eight ring slots, including configuring application paths or URLs and custom shortcuts. The interface supports live language switching and includes options to enable haptic feedback if the device supports it. Additionally, a profile scope bar enables users to manage per-app profiles for the Actions Ring, including resetting or removing specific application configurations.
crates/openlogi-desktop/src/features · high confidence
Add systemd user service for the OpenLogi background agent
A new systemd user unit file (openlogi-agent.service) is introduced to manage the OpenLogi background agent. This service runs the agent as a simple background process, automatically restarting it on failure, and is configured to start after the graphical session begins. Users can enable and start the agent for their current session using standard systemd commands.
packaging/linux/systemd · high confidence
Added diagnostic examples for hook debugging
The \openlogi-hook\ crate now includes four new example programs to help users manually verify hook behavior and diagnose issues. \print\_events\ provides a Linux-only smoke test that logs raw mouse events to stdout. \frontmost\_app\ polls and prints the currently focused application's ID and display name, useful for verifying per-app profile switching logic across platforms. \pointer\_context\ displays the window and application under the mouse pointer, including specific macOS AppKit main-loop handling. \list\_taps\ enumerates active event taps, showing details like tap ID, location, status, and owner information.
crates/openlogi-hook/examples · high confidence
Added thumbwheel trace example for debugging HID reports
A new \thumbwheel\_trace\ example has been added to the \openlogi-hid\ crate. This tool allows users to capture and decode raw \0x2150\ thumb wheel reports, displaying rotation data, tap status, and internal state bytes. It is designed to help verify device behavior against the specification before integrating with the main agent, ensuring that firmware reports are interpreted correctly.
crates/openlogi-hid/examples · high confidence
Automated Linux build environment setup for Orb CI
The .agents directory now includes executable shell scripts to automate the initialization of the build environment for the Orb CI pipeline. The setup script detects and installs required Linux system dependencies (such as gcc, clang, and Wayland libraries), installs the Rust toolchain with specific components, and fetches project dependencies, ensuring a consistent and ready-to-build state for CI jobs.
.agents · high confidence
Background agent now manages its own lifecycle, autostart, and updates
The OpenLogi agent is now a standalone, headless daemon that owns its full lifecycle, replacing the previous model where the GUI managed startup and device access. The agent now handles its own autostart reconciliation (using launchd on macOS, systemd user units on Linux, and the registry on Windows), watches its own executable for updates to relaunch automatically, and enforces a single-instance lock to prevent duplicate processes. It also manages device pairing over IPC, supervises the Actions Ring overlay helper, and hosts the menu-bar status item on macOS, ensuring that device I/O, HID++ capture, and permission prompts are handled centrally by the background process rather than the GUI.
crates/openlogi-agent/src · high confidence
Centralized agent rules and macOS permission diagnostic skills
The \.claude\ directory now serves as a central hub for agent workflows, replacing scattered documentation with a structured set of skills and rules. This change introduces a new \openlogi-macos-permissions\ skill that provides a comprehensive guide for diagnosing macOS TCC (privacy permission) issues, including a new \diagnose.sh\ script that safely checks agent status, responsible processes, code-signing identities, and log files. Additionally, symlinks have been created to centralize other skills (such as \gpui-kit\, \contributing-device-fixtures\, and \testing-openlogi-ui\) and rules under \.agents\, ensuring the agent has consistent, up-to-date guidance on device diagnostics, UI testing, and contribution standards.
.claude · high confidence
Centralized device identity registry with new Nano receiver support
The \openlogi-device-registry\ crate now centralizes hardware identity definitions for Logitech devices, providing a shared source of truth for USB/HID identities, product families, and protocol mappings. This change introduces support for the Logitech Nano receiver (product ID 0x046d:c534), commonly bundled with MK270 and MK295 wireless combos, enabling OpenLogi to recognize and manage these devices using the Unifying protocol. Additionally, the registry explicitly defines identities for Litra Glow and Litra Beam lighting devices, including their specific HID usage pages and IDs, allowing other layers of the system to correctly identify and interact with these peripherals.
crates/openlogi-device-registry · high confidence
Hardware-free mock agent for GUI development
A new \openlogi-agent-mock\ binary has been added to the agent crate, providing a scripted, in-memory device inventory that implements the same tarpc \Agent\ service as the real agent. This allows the GUI to connect, handshake, and render device states without requiring physical hardware, input monitoring, or accessibility permissions. The mock supports two modes: a default animated demo mode that cycles through scripted device states (including DPI, SmartShift, battery, and foreground app changes), and a frozen test mode driven by a JSON fixture profile (\--fixture\), which is useful for deterministic testing and development.
crates/openlogi-agent/src/bin · high confidence
Initial project scaffolding and repository structure
The repository is initialized with the foundational structure for the OpenLogi project, including the root configuration files for the Rust toolchain (rust-toolchain.toml, rustfmt.toml, clippy.toml), the Nix flake for Linux packaging and development environments (flake.nix, flake.lock), and the pre-commit hook configuration (prek.toml). It also establishes the project's public documentation and legal standing with the initial README, AGENTS.md developer guide, CHANGELOG.md, and dual MIT/Apache-2.0 license files.
(repo-wide) · high confidence
Introduce OpenLogi CLI with device management and diagnostic commands
The OpenLogi CLI is now available as a standalone binary, providing a unified interface for managing Logitech HID++ peripherals. Users can list connected devices, control keyboard backlighting, capture webcam snapshots, and adjust UVC image controls. The tool also includes diagnostic subcommands for testing smartshift behavior, DPI settings, lighting effects, and wheel resolution, as well as a fixture system for recording and validating privacy-safe device interactions. All agent communication is now bounded by a consistent timeout to prevent hanging on wedged connections.
crates/openlogi-cli/src · high confidence
Introduce openlogi-hidpp crate for Logitech HID++ protocol support
This change vendors the hidpp 0.3 fork from lus/logy into the \openlogi-hidpp\ crate, providing a Rust implementation of the Logitech HID++ protocol. It introduces core components including \HidppChannel\ for managing message routing and request-response matching, \Device\ for initializing and enumerating peripheral features, and a comprehensive registry of HID++2.0 feature implementations (such as SmartShift, RGB effects, and battery status). The crate also includes support for detecting and communicating with Logi Bolt and Unifying wireless receivers, along with utilities for protocol version detection and event emission.
crates/openlogi-hidpp/src · high confidence
Introduce per-application profile management UI
The profiles feature now supports managing individual application profiles. This change adds a reusable shell for profile tabs, a catalog picker to discover and add installed applications via a searchable popover, and an icon cache to display application icons asynchronously. Users can now switch between a default profile and specific per-application profiles, add new applications to the profile scope, and see their installed apps listed with their respective icons.
crates/openlogi-desktop/src/features/profiles · high confidence
Introduce pure domain types for HID++ device features
The \openlogi-core\ HID module now defines protocol-neutral data structures for key device capabilities, including backlight mode and status, DPI resolution and capabilities, SmartShift wheel behavior, scroll wheel reporting, standalone lighting commands, and device routing/pairing. These types serve as the shared wire format for the agent-to-GUI IPC, ensuring that semantic state (such as backlight brightness levels, DPI steps, or SmartShift thresholds) is consistently modeled and serialized across the interface, while the actual HID++ transport and I/O logic remain in the device-specific \openlogi-device\ crate.
crates/openlogi-core/src/hid · high confidence
Introduces channel pooling and registry for HID++ device connections
The device layer now manages HID++ connections through a new channel pool and registry system. The channel pool reuses existing open connections for devices on the same receiver, reducing the overhead of opening new channels for every operation. The registry tracks device nodes and their associated routes, allowing the system to efficiently look up and manage active connections. This change also includes a scripted backend for testing, enabling end-to-end testing of device enumeration and communication without requiring physical hardware.
crates/openlogi-device/src/channel · high confidence
Introduces finite smooth scrolling with configurable vertical sensitivity
The scroll runtime now supports a new finite smooth scrolling mode that processes wheel impulses into decelerating motion segments, ensuring that opposing impulses cancel correctly and high-resolution bursts are retargeted without losing distance. This feature is controlled via a new \ScrollPreferences\ system that atomically publishes smooth-scroll enablement and vertical wheel sensitivity settings, allowing users to adjust sensitivity while the system is running. The implementation includes a dedicated worker thread to handle input queuing and output generation, ensuring that OS-hook callbacks fail open if the queue is full, and that HID++ session identities are managed to prevent overflow issues.
crates/openlogi-agent-core/src/runtime/scroll · high confidence
Native HID++ recording and sanitized cassette generation
The recording subsystem now captures native HID++ channel lifetimes and standalone raw writer activity, storing evidence such as open outcomes, request-response pairs, and unassociated observations in a structured \NativeRecording\. This recorded evidence is then processed into strict, privacy-preserving cassettes where sensitive device identities (receiver UIDs, serial numbers, device unit IDs) are replaced with relation-preserving synthetic values, and invalid or incomplete recordings are rejected with specific reasons.
crates/openlogi-hid/src/recording · high confidence
New Action Ring editor with icon, shortcut, and path configuration
Users can now configure individual slots in the Actions Ring via a dedicated editor interface. This change introduces a new UI component that allows selecting specific actions, assigning custom keyboard shortcuts, defining application paths, and choosing from a set of embedded Lucide icons or default action icons. The editor provides a scrollable library of actions, clear-slot functionality, and visual feedback for selected icons and shortcuts, integrating with the existing theme palette for consistent styling.
_crates/openlogi-desktop/src/features/action\ring · high confidence
New Actions Ring feature with customizable slots, icons, and labels
Users can now configure an Actions Ring—a circular menu of eight positions that can be triggered by a button press. This change introduces the core data models for the ring, including \ActionRingSlot\ for the eight positions, \ActionRingIcon\ for visual customization of each slot, and \ActionRingEntry\ which pairs a valid action with an optional custom icon and label. The \Action\ enum is expanded to include \ShowActionsRing\ to trigger the menu, and \OpenApplication\ to launch apps or URLs. Validation ensures that \None\ and recursive \ShowActionsRing\ actions cannot be placed in the ring. Default bindings are also updated, with the Haptic Panel defaulting to opening the Actions Ring.
crates/openlogi-core/src/binding · high confidence
New CLI subcommands for device management, diagnostics, and camera control
The CLI now exposes several new top-level commands to manage and inspect Logitech hardware. The \openlogi list\ command displays paired HID++ devices and Logitech webcams, reading the inventory from the running agent when available. The \openlogi camera\ command allows users to read and write UVC image controls (such as zoom, focus, and exposure) on supported webcams. The \openlogi snapshot\ command captures a single frame from a webcam to a PNG file. For lighting, \openlogi light\ provides discovery and control for standalone Litra lights, while \openlogi backlight\ manages the persistent HID++ 0x1982 backlight on compatible keyboards. Finally, \openlogi diag\ offers a suite of smoke tests for HID++ features like DPI, battery, and wheel resolution, and \openlogi fixture\ provides tools for recording and verifying privacy-safe device fixtures.
crates/openlogi-cli/src/cmd · high confidence
New DPI and SmartShift control panels for pointer devices
Added dedicated UI panels for configuring pointer device settings. The DPI panel allows users to adjust DPI values via a slider that respects the device's specific HID++ capabilities (0x2201/0x2202), displaying only supported values and offering preset chips for quick selection. The SmartShift panel provides controls for the wheel mode (free-spin vs. ratchet), an auto-disengage sensitivity slider, and a permanent ratchet toggle, with UI elements dynamically enabling or disabling based on the current mode. Both panels integrate with the application state to commit changes to the device and persist configurations.
crates/openlogi-desktop/src/features/pointer · high confidence
New HID++ channel module with observation API and strict request-header management
The \crates/openlogi-hidpp/src/channel\ directory introduces a new communication layer for HID and HID++ devices. It defines structured error handling via \ChannelError\ and message framing for short and long HID++ reports in \message.rs\. A key behavioral addition is the channel observation API (\observation.rs\), which allows external code to monitor outgoing/incoming reports, malformed data, and request outcomes (success, timeout, cancellation) without blocking the internal read loop. The module also enforces strict request lifecycle management (\pending.rs\): it prevents two in-flight requests from sharing the same correlation header to avoid reply confusion, and quarantines abandoned request headers for a grace period to discard late replies safely. A mock transport (\mock.rs\) and comprehensive test suite are included to verify these behaviors.
crates/openlogi-hidpp/src/channel · high confidence
New HID++ write path for backlight, DPI, Fn-lock, haptics, wheel, and lighting
The \crates/openlogi-device/src/write\ module now provides the implementation for writing device settings via HID++. This includes backlight configuration (enabling/disabling and mode mapping), DPI adjustments (supporting both \0x2201\ and \0x2202\ features), Fn-lock state changes (with multi-host fallback), haptic feedback playback (with caching and arming), scroll wheel mode and resolution changes, and keyboard lighting (solid color and per-key effects). It also adds diagnostic capabilities to dump device features, reprogrammable controls, and raw battery status.
crates/openlogi-device/src/write · high confidence
New Linux installation and packaging infrastructure
OpenLogi now provides a comprehensive Linux installation experience. Users can install the application via a manual shell script (\install.sh\) or through native package managers using nfpm-generated \.deb\, \.rpm\, and Arch Linux packages. The installation process automatically deploys the four OpenLogi binaries, udev rules for Logitech device access, a systemd user service for the background agent, and a full set of desktop icons. Additionally, a NixOS module and Nix package definition are included for declarative system management.
packaging/linux · high confidence
New Settings pages for About, Appearance, Assets, Diagnostics, General, Language, Permissions, and Updates
The desktop application now includes a comprehensive Settings interface with dedicated pages for managing the application. Users can customize Appearance (light/dark mode, theme, corner radius, interface scale, and language), configure General settings (mouse profile targets, smooth scrolling, scroll sensitivity, and login-at-login behavior), and manage Assets (source preference, auto-download, cache clearing, and location). The Updates page displays the current build version, update status, and installation source, while the About page provides build identity, configuration paths, and diagnostics. Platform-specific features include Permissions management on macOS and Linux, and Diagnostics for input interception conflicts on macOS.
crates/openlogi-desktop/src/windows/settings · high confidence
New \`openlogi assets sync\` CLI command for bundling device assets
Users can now run \openlogi assets sync\ to download device-specific assets (renders, metadata, and optional side/color variants) from OpenLogi's mirrors into the \openlogi-desktop/assets\ directory. This command prepares the local file structure required by \cargo bundle\, automatically pruning obsolete depot folders and caching files via SHA-256 to avoid redundant downloads. It ensures that the bundled application includes the necessary visual assets for supported devices, handling both baseline and optional files like \side\_core.png\ and color variants.
crates/openlogi-cli/src/cmd/assets · high confidence
New agent skills and licensing for device diagnostics and GPUI Kit development
The \.agents/skills\ directory now includes normative documentation and workflows for AI agents to diagnose OpenLogi device failures, contribute and verify hardware device fixtures, and build desktop applications using the GPUI Kit framework. These skills provide step-by-step guidance for CLI and GUI troubleshooting, HID++ capture, and adherence to GPUI Kit design and coding standards. The directory also adds an Apache License 2.0 file to govern the use of these agent skills.
.agents/skills · high confidence
New background watchers for accessibility, camera, and foreground app state
The agent now includes dedicated watchers in \openlogi-agent-core\ to monitor system state changes that affect device behavior. On macOS, it polls for Accessibility permission revocations to prevent input wedging, detects camera usage via CoreMediaIO to support linked-light automation (with debouncing to avoid flickering), and tracks the foreground application to drive per-app profiles across macOS, Linux, and Windows. These watchers provide the runtime context needed for the new capture managers and gesture dispatchers to function correctly.
crates/openlogi-agent-core/src/watchers · high confidence
New button and scroll runtime modules for precise input lifecycle management
The runtime now includes dedicated modules for button and scroll handling. The new button runtime (\button.rs\, \button/worker.rs\) manages source-independent button and key lifecycles, ensuring balanced press/release events and supporting long-press actions with unique tokens to prevent stale triggers. It also handles HID++ session identities to maintain device isolation. The new scroll runtime (\scroll.rs\, \scroll/worker.rs\) introduces a finite smooth scroll model using cubic easing, allowing for smooth physical wheel input and vertical sensitivity adjustments while maintaining separate workers for traditional wheel output.
crates/openlogi-agent-core/src/runtime · high confidence
New camera capture and control backends for Linux, Windows, and macOS
This change introduces the core camera infrastructure for OpenLogi, adding platform-specific capture and control implementations for Linux (V4L2), Windows (Media Foundation), and macOS (AVFoundation). Users can now discover Logitech UVC webcams, take snapshots, and view live 720p previews on all three supported operating systems. The Linux backend prefers MJPEG for bandwidth efficiency, while Windows and macOS backends ensure frames are delivered in BGRA format for direct upload to the preview. Additionally, a unified control system is added, allowing users to adjust settings like brightness, contrast, focus, exposure, and white balance where supported by the hardware and OS.
crates/openlogi-camera · high confidence
New camera controls panel with profiles and anti-flicker/low-light support
Users can now adjust camera settings directly within the app via a new controls panel. This includes one-click presets (Default, Streaming, Video call) and custom profiles that persist per device. The panel exposes granular controls for brightness, contrast, saturation, sharpness, zoom, focus, and exposure, along with new anti-flicker (power line frequency) and low-light compensation settings. Auto modes for focus, exposure, and white balance are available with manual override, and changes are applied directly to the hardware, affecting all applications using the camera.
crates/openlogi-desktop/src/features/camera · high confidence
New core configuration and binding schema
The \openlogi-core\ crate now defines the foundational data structures for user configuration and device bindings. This includes a new TOML-based config schema (v7) that keys settings by physical device identity, supports per-app binding profiles, and introduces threshold-based long-press actions. The binding system unifies button and gesture mappings into a single map, with specific logic to project gestures to their default click actions and preserve long-press states for lifecycle-aware consumers. Additionally, the crate introduces typed domain models for RGB lighting colors, device capabilities (derived from HID++ features), and a stable device ordering system based on receiver UID, slot, and serial/unit IDs to ensure deterministic device lists across restarts.
crates/openlogi-core/src · high confidence
New desktop UI component library and theming system
The desktop application now includes a comprehensive set of reusable, theme-aware UI components located in the \ui\ module. This introduces a polished battery indicator that displays charge levels and status across various contexts (inline, glance, status, summary), a controlled carousel for device navigation, and semantic choice cards for pickers. Settings interactions are handled by a \CommitSlider\ that updates device configurations only on release to prevent excessive writes, alongside standardized form controls pinned to a 30px height. The system also features dynamic spacing tokens that scale with the interface size, a debug component gallery for development, and unified section labels and status lines to ensure visual consistency across panels.
crates/openlogi-desktop/src/ui · high confidence
New diagnostic subcommands for battery, controls, DPI, features, lighting, SmartShift, and wheel
The CLI now includes a suite of diagnostic commands under \openlogi diag\ to inspect and test specific device capabilities. \diag battery\ dumps raw battery reports (supporting both legacy 0x1000 and unified 0x1004 features). \diag controls\ displays HID++ reprogrammable control capabilities (feature 0x1b04). \diag dpi\ performs a round-trip write/read test for DPI settings (features 0x2201/0x2202). \diag features\ enumerates the device's HID++ feature table and firmware entities. \diag lighting\ sets a solid RGB color on keyboards using various lighting methods (features 0x8070, 0x8071, 0x8080, 0x8081). \diag smartshift\ toggles or sets the sensitivity of the SmartShift wheel mode (features 0x2110/0x2111). \diag wheel\ inspects or sets the HiResWheel resolution (feature 0x2121). All commands support optional device selection by name.
crates/openlogi-cli/src/cmd/diag · high confidence
New fixture crate with synthetic identity policy and manifest verification
The \openlogi-fixture\ crate introduces a host-free fixture system that defines a deterministic synthetic identity policy and validates fixture assets without file I/O or hardware access. It provides a canonical synthetic device profile and manifest for testing, enforcing strict formatting for Bolt, Unifying, and raw-HID identities, and verifies that cassette traffic exactly matches the declared identity ledger and device routes.
crates/openlogi-fixture · high confidence
New host-specific HID backend and lighting transaction management
The \openlogi-hid\ crate now provides a concrete host backend that wires the generic device layer to the OS-specific HID stack (via \async-hid\), exposing high-level entry points for DPI, SmartShift, scroll wheel, and keyboard lighting. A new \LightingJob\ system manages RGB transactions in dedicated threads with cancellation-safe cleanup and route-level locking to prevent conflicts. macOS users benefit from explicit Input Monitoring permission checks and prompts, while a file-backed probe cache ensures faster device enumeration across restarts. Additionally, a bounded native traffic recorder is available for diagnostic capture of HID++ events.
crates/openlogi-hid/src · high confidence
New keyboard function-row remapper with power-user editors
A new interactive keyboard diagram has been added to the desktop app, allowing users to remap the entire function row (Esc through F19) by clicking keycaps to open a configuration panel. This panel supports standard actions as well as power-user editors for typing text, running AppleScripts, executing shell commands, and configuring workflows. The layout intelligently adapts to different keyboard assets, using precise marker data for MX Keys-class devices or falling back to even spacing for legacy models, ensuring accurate visual mapping across hardware.
crates/openlogi-desktop/src/features/keyboard · high confidence
New lighting controls for keyboards and standalone lights
The lighting feature now includes dedicated UI panels for controlling RGB keyboard lighting and standalone light devices. Keyboard users can select from a preset color palette, toggle lighting on/off, and adjust brightness via a slider that commits changes on release to avoid performance issues. Standalone light users benefit from capability-driven sliders for brightness and color temperature, with visuals that reflect the device's online and enabled status in both gallery and detail views.
crates/openlogi-desktop/src/features/lighting · high confidence
New openlogi-assets crate for device image and metadata synchronization
A new \openlogi-assets\ crate has been introduced to centralize the fetching, parsing, and caching of Logitech device assets (PNG renders and hotspot metadata). It replaces ad-hoc asset handling with a structured system that supports multiple mirror sources (production, Cloudflare Pages, and jsDelivr) and implements SHA-256 verification to ensure downloaded files match the registry before being cached. The crate also handles complex device matching logic, including support for multiple model IDs, display name fallbacks, and legacy metadata schemas, providing a reliable foundation for the GUI's device visualization and the CLI's asset sync capabilities.
crates/openlogi-assets/src · high confidence
New permissions crate for cross-platform privacy status checks
A new \openlogi-permissions\ crate has been introduced to centralize privacy permission logic. On macOS, it provides non-prompting status checks for Accessibility, Input Monitoring, Bluetooth, and Camera permissions, along with deep links to the System Settings privacy panes. On Linux, it probes device-file access for \/dev/uinput\ and Logitech HID devices via \hidraw\, returning a tri-state status (Granted, Denied, Unknown) based on udev rule effectiveness. This separation ensures that permission prompts are raised only by the process owning the resource, avoiding code-signing identity issues.
crates/openlogi-permissions · high confidence
New platform integration layer for desktop-specific features
The \openlogi-desktop\ crate now includes a new \platform\ module that introduces several desktop-specific capabilities: users can now choose and apply custom app icons on macOS (with preview support), the app detects its installation source (e.g., Homebrew, Nix, MSI, portable ZIP) at startup for diagnostics, macOS login items are managed via \SMAppService\ with proper status reporting and settings navigation, macOS window chrome (titlebar) now respects the user's light/dark theme preference, and an opt-in update system with strict signature verification is available across platforms.
crates/openlogi-desktop/src/platform · high confidence
New privacy-safe fixture contribution workflow with strict verification
The CLI now includes a new \fixture contribute\ wizard that guides users through a two-step, resumable process to create privacy-safe fixture corpora. The first step captures a semantic device profile through the running OpenLogi Agent, while the second step records read-only HID++ cassettes for eight specific operations (feature table, firmware entities, DPI info, etc.) using the CLI's own HID permissions. All captured data is sanitized to replace sensitive receiver and device identities with synthetic values, and the workflow enforces strict safety checks, including atomic file writes, replay validation to ensure cassettes reproduce the original observations, and directory structure verification. A new \fixture verify\ command is also provided to validate the integrity, schema, and privacy guarantees of existing fixture directories.
crates/openlogi-cli/src/cmd/fixture · high confidence
New release automation tooling for changelog, versioning, and manifest generation
The release workflow now includes dedicated Rust commands to automate key release steps. A new changelog writer uses git-cliff to generate versioned sections from conventional commits, ensuring idempotent updates. A version-bump checker locates the specific commit that introduced the current workspace version to support release-plz's branch requirements. A publish-closure validator checks that all published packages have valid, versioned dependencies and are not blocked by unpublished path dependencies. Finally, a manifest generator creates the \latest.json\ update file, classifying macOS DMGs and optional Windows MSIs/Zips, verifying their minisign signatures, and enforcing minimum OS versions.
xtask/src/commands/release · high confidence
New services layer for asset resolution, device reads, and IPC management
The desktop application now organizes its core background logic into a dedicated \services\ module. This introduces an \AssetResolver\ that manages device imagery and metadata from both the application bundle and a user cache, a \DeviceReads\ service that handles DPI and SmartShift status queries using a stale-while-revalidate (SWR) caching pattern, and a robust \ipc\ client that manages the persistent connection to the background agent, including automatic reconnection, config reload queuing, and state observation. Supporting these are new \diagnostics\ and \i18n\ services to streamline system reporting and localization.
crates/openlogi-desktop/src/services · high confidence
New standalone windows for device pairing, settings, and update consent
The desktop application now uses dedicated, standalone OS windows for key workflows instead of in-app panels. Users can pair wireless devices via a new 'Add device' window that manages the pairing session state (searching, found, passkey entry, paired, failed) through the agent. A standalone Settings window exposes app-wide preferences (appearance, language, sensitivity, updates, permissions) with sidebar navigation and platform-specific pages. A first-run 'Update consent' window prompts users to opt-in to update checks, ensuring the consent buttons remain visible regardless of scroll position or UI scale.
crates/openlogi-desktop/src/windows · high confidence
New xtask CLI for repository maintenance and packaging
The repository now includes a new \xtask\ command-line interface for managing build, packaging, and CI tasks. This tool provides subcommands for running local CI jobs, managing macOS app bundles and icons, handling Linux packaging, and managing release metadata. It introduces a structured approach to icon handling via an \IconPipeline\ trait, allowing platforms to compile, install, and verify app icons consistently.
xtask/src · high confidence
New xtask support modules for macOS build and release operations
Added new Rust modules in xtask/src/support to handle filesystem utilities, macOS Info.plist manipulation, Cargo workspace manifest parsing, and Xcode environment configuration. These changes introduce structured support for stamping privacy usage descriptions, managing bundle versions, and ensuring consistent Xcode toolchain selection during macOS builds, replacing previous shell-based approaches with dedicated Rust implementations.
xtask/src/support · high confidence
OpenLogi desktop application launches with full device configuration UI
The OpenLogi desktop application is now available, providing a graphical interface for managing connected devices. Users can view a gallery of paired devices, access detailed configuration panels for buttons, action rings, lighting, DPI, and camera previews, and manage application settings. The app supports cross-platform installation detection (macOS Homebrew, Linux package managers, Windows MSI/Portable) and integrates with the background agent for device control.
crates/openlogi-desktop/src · high confidence
Redesigned device configuration workspace with per-app Actions Ring profiles
The desktop application's state management has been restructured to support a redesigned device configuration workspace. This change introduces a dedicated Actions Ring editor that allows users to create and manage application-specific button layouts (profiles) for the selected device, in addition to the existing global default layout. The new state layer also consolidates device session data, refactors binding and camera control persistence, and improves how device records are keyed and merged to prevent duplicate entries for the same physical device.
crates/openlogi-desktop/src/state · high confidence
Sanitized cassettes replace sensitive device identities during recording
The cassette recording system now automatically sanitizes recorded HID traffic by replacing sensitive device identifiers (such as Bolt Receiver UIDs, Unifying serial numbers, device unit IDs, and device serial numbers) with synthetic, deterministic placeholders. This ensures that recorded cassettes are safe for sharing or testing without exposing unique hardware secrets, while preserving the structural relationships and FIFO ordering of the original protocol exchanges.
crates/openlogi-hid/src/recording/cassette · high confidence
Semantic device profile capture with synthetic identity sanitization
The CLI now supports capturing semantic device profiles, allowing users to record device configurations while automatically sanitizing sensitive identifiers. The new sanitize module replaces real receiver UIDs, device serial numbers, and unit IDs with deterministic synthetic identities based on the device type (e.g., Unifying Receiver, Bolt Receiver, or Raw HID), ensuring that captured profiles are safe for sharing or testing. Target selection logic has been updated to project physical device routes for both inventory-paired and standalone devices, and comprehensive tests verify that the capture process remains read-only and correctly handles feature support and device reachability.
_crates/openlogi-cli/src/cmd/fixture/record\profile · high confidence
Standalone Actions Ring overlay process
A new standalone \openlogi-overlay\ binary now hosts the Actions Ring UI, separating it from the main desktop application. This lightweight process connects to the agent via IPC to receive ring invocations, renders the ring window centered on the cursor (with platform-specific placement logic for macOS, Linux, and Windows), and reports user interactions like hover, activation, and cancellation back to the agent. It handles its own lifecycle, including role claiming to ensure only one overlay instance runs per agent session, and implements click-away dismissal on macOS.
crates/openlogi-overlay · high confidence
Support for Extended Adjustable DPI (0x2202) feature
Added support for the Logitech Extended Adjustable DPI HID++ feature, enabling users to query and configure DPI ranges (fixed values and stepped ranges), lift-off distance settings, and sensor calibration parameters. This includes parsing device capabilities, handling DPI parameter change events, and processing calibration completion results for compatible mice.
_crates/openlogi-hidpp/src/feature/extended\dpi · high confidence
Support for Logi Bolt and Unifying receivers
Added receiver implementations for Logi Bolt and Unifying protocols, enabling the discovery, pairing, and enumeration of devices connected via these receivers. The Bolt implementation handles BTLE-based passkey authentication and device discovery, while the Unifying implementation manages 2.4 GHz device connections, including enabling wireless notifications to ensure paired devices are correctly enumerated at startup.
crates/openlogi-hidpp/src/receiver · high confidence
Support for Logitech HID++ Reprogrammable Controls (0x1b04)
The HID++ feature layer now supports the 0x1b04 Reprogrammable Controls feature, enabling the system to parse and interpret device-specific reprogrammable button events. This includes decoding diverted button states, raw mouse movement (X/Y), raw wheel deltas, and analytics key events. The module also provides a comprehensive set of named constants for official and reverse-engineered Control IDs (e.g., Smart Shift, Multi-Platform App Switch) and Task IDs (e.g., Mission Control, DPI Change), allowing applications to map physical hardware inputs to specific software actions.
_crates/openlogi-hidpp/src/feature/reprog\controls · high confidence
Support for new HID++ device features and capabilities
This update adds support for several new HID++ features, including Adjustable DPI (0x2201) for reading and changing mouse sensor DPI, Backlight (0x1982) for keyboard backlight control, BatteryStatus (0x1000) and BatteryVoltage (0x1001) for battery level reporting, BrightnessControl (0x8040) for display brightness, ChangeHost (0x1814) for multi-host device switching, ColorLedEffects (0x8070) for RGB lighting effects, Crown (0x4600) for rotary crown controls, DeviceFriendlyName (0x0007) for custom device naming, and DeviceInformation (0x0003) for general device info. These features enable users to configure DPI settings, manage backlight and brightness, monitor battery status, switch between hosts, customize RGB effects, control rotary crowns, set device names, and view device information.
crates/openlogi-hidpp/src/feature · high confidence
Support for raw touchpad coordinate reporting
The touchpad feature now exposes raw 14-bit X/Y touch coordinates via the \TouchpadRawXy\ (0x6100) HID++ event. This change adds the \TouchPoint\ and \DualXyData\ structures to represent individual touch points and frames, along with a decoder that parses the raw payload into these types. Users can now access low-level touch data, including contact status, finger IDs, and button states, which is useful for custom gesture handling or precise input tracking. The implementation includes unit tests to verify the decoding logic and touchpad info parsing.
_crates/openlogi-hidpp/src/feature/touchpad\_raw\xy · high confidence
Support for runtime app icon switching on macOS
The macOS build pipeline now compiles multiple icon variants (default and alternates like 'Prism') from Icon Composer documents and installs them into the application bundle. This enables the application to switch icons at runtime, with the build process ensuring the asset catalog, previews for the settings picker, and alternate \.icns\ files are correctly placed and verified.
xtask/src/icon · high confidence
Switchable device gallery views (Grid, List, Carousel)
The Home screen now supports three distinct layouts for the device gallery: Grid, List, and Carousel. Users can switch between these views using the new view switcher controls, with the selected layout persisted in settings. The Grid view displays devices in a responsive flex-wrap layout, the List view presents them in a vertical stack, and the Carousel view offers a horizontal scrolling interface with fixed-width cards. All views maintain consistent device ordering (online devices first) and context menu access.
crates/openlogi-desktop/src/app/home · high confidence
Windows MSI installer now bundles the CLI, background agent, and overlay executable
The new Windows MSI installer (OpenLogi.wxs) packages the main GUI, the background agent (openlogi-agent.exe), the overlay executable (openlogi-overlay.exe), and the CLI (openlogi.exe). The CLI is installed in a dedicated bin subdirectory and added to the user's PATH, enabling device diagnostics commands like openlogi list and openlogi diag features that were previously unavailable on Windows. The installer uses per-user scope, installs to %LocalAppData%, and includes logic to close running processes during upgrades to prevent file-in-use errors.
packaging/windows · high confidence
Windows input hooking and foreground app observation
The Windows backend for the input hook now implements low-level mouse and keyboard monitoring via \WH\_MOUSE\_LL\ and \WH\_KEYBOARD\_LL\ hooks, including DPI-aware cursor position normalization and foreground application detection. A dedicated foreground observer thread uses Win32 event hooks to track the active application, while pointer context support provides native window hit-testing and identity checks. These changes establish the core Windows-specific infrastructure for capturing and reporting user input and context.
crates/openlogi-hook/src/windows · high confidence
Architecture
Extracted IPC contract into a dedicated leaf crate
The agent-to-GUI communication logic has been consolidated into a new \openlogi-ipc\ crate. This change centralizes the tarpc service definition, wire types, and cross-platform transport (Unix-domain sockets on macOS/Linux, named pipes on Windows) into a single location. Clients now use a unified \connect\_as\ entry point that enforces a strict handshake policy—including protocol version checking and a 2-second timeout—ensuring consistent connection behavior across the settings app, CLI, and overlay helper. The crate also introduces an \Observer\ pattern for managing the agent's state-streaming channel and provides an in-memory testing harness for client-side integration tests without requiring a live agent process.
crates/openlogi-ipc/src · high confidence
Extracted headless agent orchestration into a new core crate
The background agent's runtime logic has been extracted into a new \openlogi-agent-core\ crate, enabling the always-on daemon to operate without the GUI. This change introduces dedicated modules for managing the Actions Ring session state, per-device capture plans (defining which inputs to divert and how to dispatch them), DPI cycle state, and a live event monitor for debugging. It also centralizes hardware operations through a new \DeviceOp\ abstraction that routes all HID++ reads and writes through inventory channels with a strict timeout, and establishes a single \ObservableState\ cell to efficiently notify the GUI of agent status and inventory changes.
crates/openlogi-agent-core/src · high confidence
Extracted platform-specific input injection into the openlogi-inject crate
The OS-level input-event synthesis logic has been moved from openlogi-core into a new \openlogi-inject\ crate, keeping the core schema platform- and IO-free. This change introduces platform-specific backends for macOS (using CGEvent and private Accessibility/Dock SPIs), Linux (using uinput and D-Bus), and Windows (using SendInput), along with a shared \execute\ entry point that dispatches actions to the correct backend. A new \inject\_action\ example is provided for manual smoke-testing of these injection capabilities.
crates/openlogi-inject · high confidence
HID++ device layer extracted into a portable, host-agnostic crate
The HID++ device layer has been extracted into the new \openlogi-device\ crate, establishing a clean separation between protocol logic and host-specific operating system integration. This change introduces a \HidBackend\ trait that acts as a portable seam, allowing the core enumeration, probing, pairing, and capture logic to remain independent of the underlying HID stack (such as \async-hid\ on macOS/Linux or WebHID). The new structure includes a \DeviceIoGate\ to manage host lifecycle events like suspension, a \host\_lock\ module for cross-process arbitration of receiver register access, and a refined \inventory\ system with persistent channel caching and ledger-based recovery. This refactoring ensures the device layer is testable with scripted backends and buildable for non-native targets like WebAssembly.
crates/openlogi-device/src · high confidence
Behavioural changes
2 commits (0 fixes) modifying crates/openlogi-desktop/icon
A change to existing behaviour in crates/openlogi-desktop/icon — 2 commits, 1 file.
crates/openlogi-desktop/icon · medium confidence · unverified
Camera preview lifecycle and capture abstraction
The camera preview feature now uses a dedicated Capture trait to abstract hardware access, allowing the preview component to be tested with fake capture resources. This change introduces a more robust lifecycle management for the camera stream, ensuring that the preview correctly handles permission events, target changes, and startup failures without unnecessary retries or race conditions.
crates/openlogi-desktop/src/features/camera/preview · high confidence
Centralized hardware context and background light re-application
The hardware subsystem now uses a unified \HardwareContext\ to manage backend access, device I/O gating, and probe caching, replacing scattered initialization. Additionally, standalone light settings are applied via background workers that serialize writes and coalesce rapid configuration changes, ensuring that explicit user commands take precedence over automatic re-application during reconnects or config updates.
crates/openlogi-agent-core/src/hardware · high confidence
Improved HID device handling and Windows write reliability
The HID transport layer now preserves usage pairs in the native handle cache to prevent macOS from selecting the wrong logical device when multiple collections share the same registry ID. On Windows, a native FFI-based write fallback is added to handle async-hid write quirks, and the read loop is fixed to park on permanently dead handles instead of busy-spinning. Additionally, collection path normalization ensures that short and long HID++ collections on the same interface are correctly grouped, while distinct physical receivers remain separate.
crates/openlogi-hid/src/transport · high confidence
Improved macOS development experience and dependency auditing
Developers on macOS now get a better local experience: running the desktop app via \cargo run\ automatically builds it into a proper \.app\ bundle so the correct name and icon appear in the Dock, and the linker is forced to use Apple's \/usr/bin/cc\ to resolve system symbols correctly when using Nix. Additionally, \cargo-deny\ is now configured to enforce license compliance and advisory checks for the CLI crate, while explicitly ignoring a non-security advisory for \bincode\ required by the IPC protocol.
.cargo · high confidence
Introduce derive macro to automate HID++ feature boilerplate
A new \\#\[derive(Feature)\]\ macro has been added to the \openlogi-hidpp-derive\ crate to automatically generate the \CreatableFeature\ and \Feature\ trait implementations for HID++ device features. This eliminates the need for manual, repetitive boilerplate code; users can now define feature structs with a simple \\#\[creatable(id = ..., version = ...)\]\ attribute, and the macro handles the required \new\ constructor logic (including automatic \EventSource\ attachment for emitting features).
crates/openlogi-hidpp-derive · high confidence
Inventory probe caching and channel lifecycle management
The device inventory system now caches expensive probe results (model info, capabilities) to avoid re-interviewing devices on every tick, using a 30-second refresh interval and persisting Bolt device identities across agent restarts. It also introduces a channel lifecycle manager that prevents concurrent OS node access and automatically evicts wedged channels after consecutive failures, while a health ledger replays the last known good inventory for up to three ticks when a node becomes unresponsive to prevent GUI flapping.
crates/openlogi-device/src/inventory · high confidence
Linux foreground detection now uses display-server-specific backends
The Linux hook now detects the active application using a backend selected per display server: the wlroots foreign-toplevel protocol on wlroots compositors, a GNOME Shell D-Bus extension on GNOME, and X11 \\_NET\_ACTIVE\_WINDOW\ elsewhere. This ensures accurate foreground reporting across different Linux environments, though profile keys may differ between backends (e.g., \app\_id\ vs \WM\_CLASS\). The change also fixes a resource leak in the GNOME observer sockets.
crates/openlogi-hook/src/linux · high confidence
Local CI runner validates alignment with CI workflow and adds Windows test job
The local CI runner now includes a new Windows test job and enforces that the local execution plan matches the \ci.yml\ workflow file. This is achieved through new drift-check tests that verify every command in the workflow is reproducible locally and that all workflow job names resolve to a known local job, ensuring the local runner stays in sync with the CI pipeline.
xtask/src/commands/ci/jobs · high confidence
New asset resolution service with SWR caching and inter-key glow support
The desktop application now uses a dedicated asset service layer that replaces the previous hand-rolled sync logic with an SWR (stale-while-revalidate) caching strategy. This ensures the asset index is fetched once per session and device depots are synced efficiently, with automatic retries and stale data serving during network delays. The service introduces support for inter-key RGB glow effects on floating-key keyboards by decoding precomputed RLE masks from depot metadata or deriving them from image alpha channels at runtime. It also improves device matching by resolving assets via firmware codenames and secondary PIDs (e.g., for BTLE connections), and correctly handles handed devices (like the Lift) by looking up variant-specific metadata in the manifest when standard schema files are absent.
crates/openlogi-desktop/src/services/assets · high confidence
New structured CI runner with --list and --dry-run support
The local CI runner (\cargo xtask ci\) has been refactored to use a structured job model defined in \xtask/src/commands/ci/jobs.rs\, replacing the previous shell-script-based approach. This change introduces a \--list\ command that renders a formatted table of all CI jobs (such as \rustfmt\, \typos\, \tests\, \wasm\, etc.) with their supported hosts and specific caveats, and a \--dry-run\ mode that prints the exact commands that would be executed. The runner now explicitly models jobs for Windows tests (\TestsWindows\), Wasm portable crates (\Wasm\), and other suites, ensuring that local runs align with the CI workflow definitions.
xtask/src/commands/ci · high confidence
Redesigned device gallery and detail workspace
The main application interface has been rebuilt with a new Home screen featuring a switchable device gallery (grid, list, and carousel views) and a comprehensive device-detail workspace. The detail view replaces the previous layout with a stable left-side navigation rail and section-specific panels for Buttons, Action Ring, Keys, Pointer, Lighting, Camera, and Device settings. The gallery now displays device status, battery levels, and dynamic RGB lighting glows on keyboard images, while the detail view provides a unified surface for configuring per-app profiles and custom controls.
crates/openlogi-desktop/src/app · high confidence
Redesigned mouse configuration workspace with interactive diagram
The mouse configuration interface has been rebuilt to feature an interactive device diagram that displays button hotspots, leader lines, and side-label cards. This new layout replaces the previous list-based view, allowing users to visually select buttons on the mouse model to edit their bindings in a dedicated inspector panel. The change includes logic to correctly map device assets to hotspot coordinates, handle thumb-wheel rotation as a single control, and support gesture bindings, providing a more intuitive and spatially aware configuration experience.
crates/openlogi-desktop/src/features/mouse · high confidence
Refactored IPC agent launch and connection handling
The IPC service layer has been restructured to improve reliability and clarity in how the desktop app manages the background agent. Agent launching is now supervised-only on macOS production builds, using \launchctl kickstart\ and on-demand registration to ensure the agent runs under proper system controls, while direct binary launching is reserved for development profiles. The connection state machine has been simplified to a single typestate, distinguishing between cold starts and lost connections, with specific logic to prevent respawning the agent when the GUI is outdated or the suite is quitting. Additionally, IPC requests are now handled through a unified type system that cleanly separates RPC execution from outcome delivery, ensuring consistent error handling for unreachable agents.
crates/openlogi-desktop/src/services/ipc · high confidence
Refactored device management into a dedicated module with improved re-apply logic
The device list construction, stable identity resolution, and volatile settings re-apply planning have been moved from the orchestrator into a new \devices.rs\ module. This change introduces a more robust mechanism for detecting when device settings need to be re-applied, specifically handling scenarios where devices reconnect after sleep or re-enumerate under new identities, ensuring settings are correctly restored without relying on transport-specific keys.
crates/openlogi-agent-core/src/orchestrator · high confidence
Refactored gesture capture session with dedicated accumulator and arming modules
The gesture capture logic in the device session has been restructured into modular components: a new \accum.rs\ module handles the state machine for diverting raw-XY reports and tracking button edges, while \arm.rs\ manages the firmware diversion and restoration of gesture sources. This change introduces a \CaptureAccum\ that correctly attributes motion to the first held source, drops ambiguous motion during overlapping holds, and ensures that tap gestures on the thumb wheel do not trigger unintended actions. Comprehensive tests verify the new accumulator's behavior, including hold takeover, overlap handling, and restore logic.
crates/openlogi-device/src/session/gesture · high confidence
Removal of default main.rs entry point
The default src/main.rs file containing the standard "Hello, world!" program has been removed from the project. This change reflects the initialization of the project structure, likely as part of setting up a new workspace or build configuration, rather than a functional update to the application itself.
src · high confidence
Rename crate to openlogi-desktop and add agent documentation
The crate previously known as openlogi-gui has been renamed to openlogi-desktop. To support this change and clarify the architecture, a new AGENTS.md file was added to document the crate's role as a pure IPC client for the settings UI, its separation from the overlay and agent processes, and the structure of its source code. A CLAUDE.md file was also added to link to the agent guide.
crates/openlogi-desktop · high confidence
Reorganize xtask commands into domain-specific modules
The xtask CLI has been restructured to organize repository tasks by domain. The previous shell-based CI runner (ci-local.sh) is replaced by a Rust implementation (xtask ci) that reproduces jobs from .github/workflows/ci.yml, allowing developers to run CI steps locally with a --list option to view available jobs. macOS-specific operations (icon compilation, bundle building, DMG creation, and packaging) are now handled via dedicated subcommands (xtask macos icon, bundle, dev-bundle, dmg, package), including channel-based identity stamping for dev vs. distribution builds. Linux packaging is exposed via xtask linux package. Release management tasks (changelog generation, publish dependency validation, version-bump checkout, and latest.json manifest generation) are consolidated under xtask release subcommands. This change improves local development workflow consistency and replaces fragile shell scripts with typed, testable Rust code.
xtask/src/commands · high confidence
Restructured configuration schema with per-device identity and conflict-safe persistence
The configuration system has been refactored to key device settings by stable physical identity rather than transport route, ensuring that bindings and DPI settings follow a mouse when it moves between a USB cable and a wireless receiver. This change introduces a new schema version that migrates legacy transport-scoped keys into a unified identity-based model, while also supporting per-application binding overrides and per-link settings for devices with different capabilities on different connections. To prevent data loss, the new file persistence layer includes conflict detection that rejects saves if the config file has been modified externally, and it retains comments and formatting during updates.
crates/openlogi-core/src/config · high confidence
Robust macOS login item registration with version-aware re-registration
The macOS login item (agent service) registration logic has been rewritten to prevent launch failures on macOS 13 and 14 and to automatically repair broken launchd jobs. The new implementation avoids linking the \SMAppServiceErrorDomain\ symbol (which is only exported in macOS 15) by spelling out the error domain string, ensuring the app can launch on older systems. It also introduces a version marker file that triggers a re-registration when the app is updated, and detects when a launchd job is missing despite the service being registered, performing an unregister-then-register dance to restore functionality.
crates/openlogi-desktop/src/platform/registration · high confidence
Shared UI assets and styling for the Actions Ring overlay
The \openlogi-ui\ crate now provides shared presentation resources for both the settings app and the Actions Ring overlay. It embeds a set of Lucide SVG icons (served via a dedicated \AssetSource\) to ensure the overlay's action ring glyphs match the settings app exactly, and defines a single brand accent color constant (\ACCENT\_BLUE\) with a helper to adjust lightness, preventing the overlay from drifting to a different hue when drawing on its dark background.
crates/openlogi-ui/src · high confidence
Strict receiver-slot state enforcement during cassette replay
The replay backend now validates that HID++ traffic matches declared receiver slot pairings and link liveness. When a cassette is played back, the system checks that paired devices are reported as online for device-addressed exchanges and that connection/disconnection notifications align with the declared slot states. If a mismatch occurs—such as a request targeting an offline or empty slot—the replay fails with a diagnostic error rather than silently consuming the cassette entry, ensuring that test fixtures accurately reflect real hardware constraints.
crates/openlogi-device/src/replay · high confidence
Unified capture session lifecycle with event-driven liveness and robust control restoration
The device layer now uses a shared \session/capture\ module to manage the lifecycle of all input capture sessions (gesture, keyboard, and host-switch). This change replaces the previous polling-based approach with an event-driven architecture that listens for HID++ reports to detect channel liveness, automatically deferring probes when activity is detected. It introduces a standardized \CaptureHost\ interface and \ArmedCapture\ trait to decouple the session management logic from device-specific control arming, ensuring that diverted controls are reliably restored to their native state on shutdown or channel replacement, even across wireless reconnects or I/O suspensions.
crates/openlogi-device/src/session · high confidence
Unified macOS bundle assembly with hardened dev builds
The macOS packaging workflow has been consolidated into a single codebase under \xtask/src/commands/macos\, replacing separate implementations for development and production bundles. The new \dev\_bundle\ command now constructs a full \OpenLogi.app\ for local development, ensuring the dev build matches the shipped bundle's structure (including \Info.plist\, icons, and helper binaries) so that permission grants (Accessibility, Input Monitoring) and URL handlers behave consistently. It also automatically starts the dev agent helper and waits for its IPC socket before the GUI launches. The \bundle\ command handles production builds, embedding the CLI, signing with Developer ID, and verifying bundle identity. Additionally, the \dmg\ command now supports signing the final disk image and verifies that the contained app bundle carries the correct production identity.
xtask/src/commands/macos · high confidence
Vendor HID++ protocol implementation and fix sub-register read matching
The HID++ protocol handling in this crate has been replaced with a vendored implementation from the lus/logy fork, introducing dedicated modules for HID++1.0 and HID++2.0 message structures and channel operations. This change includes a behavioral fix for HID++1.0 register reads: the response matching logic now verifies the echoed sub-register byte, preventing phantom device slots from appearing in inventories when multiple processes probe a Bolt receiver simultaneously.
crates/openlogi-hidpp/src/protocol · high confidence
Windows agent now displays a custom icon and version metadata
On Windows, the openlogi-agent executable now embeds a custom application icon and a VERSIONINFO resource block. This means the agent will appear with its own icon in Task Manager and Explorer instead of a generic blank binary, and its version details (company, file description, version number) are now visible in file properties.
crates/openlogi-agent · high confidence
macOS bundle identity and launchd service registration are now explicit and channel-aware
The macOS packaging process now strictly manages bundle identifiers and launchd service labels, separating production and development builds to prevent permission and configuration collisions. The build tooling explicitly stamps and verifies the \CFBundleIdentifier\ for the main app and its nested login-item helpers (the agent and overlay), ensuring that development builds use a suffixed identity (e.g., \-dev\) so they do not overwrite production permissions or config directories. Additionally, the agent's launchd service plist is now embedded directly into the app bundle, using \BundleProgram\ to ensure the service registration survives app moves, and the build process verifies that all expected binaries and icons are present before signing.
xtask/src/commands/macos/bundle · high confidence
macOS bundle metadata and entitlements for desktop, agent, and overlay
The macOS build now includes explicit bundle metadata and entitlements for the main desktop app, the login-item agent, and the overlay renderer. The main app bundle registers the openlogi:// deep-link scheme and declares camera usage, while the agent and overlay are configured as background-only helper apps (LSUIElement) with distinct identifiers to ensure stable system permissions and a clean menu-bar experience. Additionally, the main app bundle now includes the com.apple.security.device.camera entitlement to guarantee camera access works correctly under the hardened runtime.
crates/openlogi-desktop/bundle · high confidence
Fixes
Fix Linux package build to include the overlay binary
The Linux packaging task now ensures that the \openlogi-overlay\ binary is consistently built and included in \.deb\, \.rpm\, and Arch Linux packages. Previously, a mismatch between the build configuration and the package manifest caused the overlay binary to be omitted unless it remained in the build cache from a previous run. This change aligns the build targets with the \nfpm.yaml\ configuration and adds a test to prevent future drift.
xtask/src/commands/linux · high confidence
Linux autostart now respects existing systemd units and uses atomic ownership markers
On Linux, the agent's autostart reconciliation now avoids overwriting or deleting systemd user units that it did not generate, such as those installed by distribution packages or administrators; instead, it honours the enable/disable toggle via enablement alone. It also migrates legacy units from the config tier to the data tier and uses an atomic marker to track ownership, ensuring that only units created by the agent are disabled or removed during reconciliation.
crates/openlogi-agent/src/autostart · high confidence
Terminal exit remains responsive during agent replacement
The agent now ensures that the terminal exit process stays responsive even when a replacement is in progress. Previously, the shutdown sequence might have blocked indefinitely waiting for HID++ hardware sessions to drain. The new lifecycle logic introduces a bounded timeout (3 seconds) for teardown during exit, allowing the process to terminate promptly rather than hanging on slow hardware disconnection, while still attempting to clean up existing resources.
crates/openlogi-agent/src/lifecycle · high confidence
Test coverage
Added integration test for locale catalog parity; Added regression tests for OS-hook state and dispatch policy; Added tests for IPC wire format stability; Added unit tests for Persistent Remappable Action payload parsing; Added unit tests for the orchestrator module; Expanded test coverage for desktop AppState state management; Unit tests for per-key lighting request encoding.
Dependencies
Introduce release-notes script and restructure Rust workspace
This change adds a new Node.js-based release-notes script (using @octokit/rest, openai, and semver) to automate changelog generation, and restructures the Rust project into a virtual workspace. The workspace unifies the version to 0.8.9, sets the MSRV to Rust 1.98, and organizes the code into distinct crates (openlogi-agent, openlogi-desktop, openlogi-cli, etc.) with shared dependencies like tarpc 0.38, gpui 0.3.4, and objc2 0.6.4.
(dependencies) · high confidence
Housekeeping
Reorganization of the openlogi binary crate location
The openlogi binary crate has been moved to the crates/openlogi directory. This change restructures the project layout without altering the runtime behavior of the CLI tool, which continues to invoke the openlogi\_cli::run() function via a Tokio current-thread executor.
crates/openlogi · high confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 73 → 73 (+0.9)
- Rubric changed (rubric-2026.09.8 → rubric-2026.09.16) — scores are not directly comparable.
Lenses
- Code Health 90 → 91 (+0.8)
- Architecture 92 → 92 (-0.2)
- Maturity 71 → 71 (+0.0)
- Readiness 68 → 66 (-1.7)
- Security 69 → 79 (+10.2)
- Event Sourcing 100 → 100 (+0.0)
- Performance 100 (new)
Resolved (88)
- AppView::render (cognitive 20) (crates/openlogi-desktop/src/app.rs)
- Change coupling: add_device.rs ↔ appearance.rs (crates/openlogi-desktop/src/windows/add_device.rs)
- Change coupling: appearance.rs ↔ permissions.rs (crates/openlogi-desktop/src/windows/settings/appearance.rs)
- Change coupling: device.rs ↔ dpi.rs (crates/openlogi-desktop/src/features/lighting/device.rs)
- Change coupling: dpi.rs ↔ smartshift.rs (crates/openlogi-desktop/src/features/pointer/dpi.rs)
- Change coupling: hook.rs ↔ bindings.rs (crates/openlogi-agent-core/src/runtime/hook.rs)
- Change coupling: host_switch.rs ↔ lib.rs (crates/openlogi-device/src/session/host_switch.rs)
- Change coupling: lib.rs ↔ transport.rs (crates/openlogi-device/src/lib.rs)
- ClassTooLong: Config (crates/openlogi-core/src/config.rs)
- Config::migrate_owner_locked_gestures (cognitive 24) (crates/openlogi-core/src/config.rs)
- Config::migrate_thumbwheel_native_direction (cognitive 18) (crates/openlogi-core/src/config.rs)
- Dependency source pinned to a moving git ref
- Documentation: no installation or build instructions (README.md)
- Documentation: no installation or build instructions (docs/README.de.md)
- Documentation: no installation or build instructions (docs/README.fr.md)
- Documentation: no installation or build instructions (docs/README.ja.md)
- Documentation: no installation or build instructions (docs/README.ko.md)
- Documentation: no usage examples (docs/USAGE.md)
- Duplicated block (10 lines × 2) (crates/openlogi-agent-core/src/runtime/button.rs)
- Duplicated block (10 lines × 2) (crates/openlogi-desktop/src/features/action_ring.rs)
- …and 68 more
New (63)
- ActionExecutor::dispatch_to (cognitive 23) (crates/openlogi-agent-core/src/runtime.rs)
- ActionExecutor::dispatch_to (cyclomatic 16) (crates/openlogi-agent-core/src/runtime.rs)
- Ambiguous duplication: Two methods with nearly identical names suggest different return types or behaviors (e.g., parsed vs raw bytes), but the signatures are identical (Result). Without documentation, it is unclear if one is deprecated, if they return different types, or if one is a mistake.
- Ambiguous duplication: latest_frame and take_frame likely differ in semantics (e.g., non-blocking peek vs. blocking/consuming), but the identical signatures and similar naming create confusion about which to use for non-blocking reads.
- AppView::render_content (cognitive 20) (crates/openlogi-desktop/src/app.rs)
- CaptureAccum::on_event (cognitive 35) (crates/openlogi-device/src/session/gesture/accum.rs)
- CaptureAccum::on_event (cyclomatic 21) (crates/openlogi-device/src/session/gesture/accum.rs)
- Change coupling: binding_editor.rs ↔ view.rs (crates/openlogi-desktop/src/features/binding_editor.rs)
- Change coupling: function_row.rs ↔ view.rs (crates/openlogi-desktop/src/features/keyboard/function_row.rs)
- Change coupling: route.rs ↔ pairing.rs (crates/openlogi-device/src/channel/route.rs)
- Change coupling: tests.rs ↔ keyboard.rs (crates/openlogi-device/src/session/gesture/tests.rs)
- Config::migrate_owner_locked_gestures (cognitive 24) (crates/openlogi-core/src/config/migrate.rs)
- Config::migrate_thumbwheel_native_direction (cognitive 18) (crates/openlogi-core/src/config/migrate.rs)
- Dependency hygiene PARTLY measured — Cargo dependencies read, dependency currency not (crates.io unreachable)
- Duplicate intent across types: Both Config and ConfigFile expose load_or_default. It is unclear if ConfigFile is a lower-level utility and Config is the high-level facade, or if they are redundant entry points for the same operation.
- Duplicate intent across types: Same as above, load_from_path exists on both Config and ConfigFile with identical signatures.
- Duplicated block (10 lines × 2) (crates/openlogi-agent-core/src/runtime/button/worker.rs)
- Duplicated block (10 lines × 2) (crates/openlogi-device/src/inventory/probe/bolt.rs)
- Duplicated block (10 lines × 2) (crates/openlogi-hid/src/transport.rs)
- Duplicated block (11–12 lines × 2) (crates/openlogi-inject/src/inject/macos.rs)
- …and 43 more
Changes since last survey
- 269 commits — 214 feature/other, 55 fixes
By area
- crates/openlogi-desktop — 81 commits
- crates/openlogi-device — 47 commits
- crates/openlogi-agent-core — 26 commits
- crates/openlogi-core — 13 commits
- .ast-grep/rules — 12 commits
- (root) — 11 commits
- crates/openlogi-hidpp — 11 commits
- crates/openlogi-cli — 10 commits
- crates/openlogi-hook — 10 commits
- xtask/src — 10 commits
- crates/openlogi-agent — 9 commits
- crates/openlogi-ui — 7 commits
- .agents/rules — 4 commits
- crates/openlogi-ipc — 4 commits
- crates/openlogi-overlay — 4 commits
- .agents/skills — 3 commits
- crates/openlogi-inject — 3 commits
- crates/openlogi-camera — 1 commit
- crates/openlogi-device-registry — 1 commit
- crates/openlogi-fixture — 1 commit
Notable commits
- fix: fix(agent): divert a single-bound gesture button (#1569)
- fix: fix(agent): honor per-app overrides for hidpp gestures
- fix: fix(agent): log a DPI or SmartShift write only once one is scheduled
- fix: fix(agent): say why a background write was skipped
- fix: fix(agent): start the HID++ watchers through one named worker shell
- fix: fix(camera): refuse a camera another application is streaming
- fix: fix(camera): require a stored frame before reporting startup
- fix: fix(cli): select rgb devices through receiver routes
- fix: fix(cli): stop naming the agent lock file outside its owner
- fix: fix(cli): stop telling users Unifying receivers are not surfaced
- fix: fix(cli): tell a timed-out profile capture what to do next
- fix: fix(core): preserve existing middle click gestures
- fix: fix(deps): update rustls to address RUSTSEC-2026-0285
- fix: fix(gui): clamp camera control values through the ordered range
- fix: fix(gui): correct thumb-wheel volume preset labels (#1436)
- fix: fix(gui): declare the alignment bespoke buttons relied on
- fix: fix(gui): hold a config reload until the agent connects
- fix: fix(gui): keep a snapped sync off a slider mid-drag
- fix: fix(gui): keep the relaunch notice ahead of the unreachable one
- fix: fix(gui): keep update consent buttons visible
- …and 249 more
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
AprilNEA/OpenLogi was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 28 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit bc21025d7a96faa8bb0f8dfeb880664a2daa3c31 — the exact code this score is about.
- Scored under rubric-2026.09.16 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-d46da229e3fd.