All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- (assets) ask the jsDelivr data API for the newest asset release (#2040)
- (desktop) add a keyboard backlight duration timer (#1879)
- (core,agent,gui) add guarded disable-keys controls (#993)
- (core,agent,gui) add a press force setting for the MX Master 4 Haptic Sense Panel (#2021)
- (hidpp) add capability-bound force sensing buttons (#2016)
- (release) cut betas from a workflow and tell the tap about them (#2005)
- (release) build a beta at its own version (#2004)
- (xtask,ci) compose update channel files from per-release records (#2000)
- (agent) drive the mock agent from a stdin control console (#2003)
- (assets) follow the 0.1 asset release line instead of pinning 0.1.0 (#2039)
- (i18n) translate the receiver chooser, old-pairing cleanup, and update channel in Czech (#2034)
- (cli) route backlight operations through the agent (#2031)
- (windows) post the layout's scan code with keys a layout can move (#2028)
- (overlay) draw the Windows Actions Ring without a window frame (#1913)
- (agent) re-apply volatile settings after replacing a dead channel (#1997)
- (i18n) translate the disable-keys strings in 22 locales (#2024)
- (deps) update Tokio for AsyncFd soundness advisory (#2019)
- (device) bound Bolt receiver identity reads (#2009)
- (release) name Sparkle deltas so Sparkle applies them (#2002)
- (agent) report whether the virtual HID keyboard carries keys (#1991)
- (device) recognize the Logitech G600 as a standalone mouse (#1961)
- (desktop) let users follow the beta update channel (#1980)
- (xtask) read the release channel and build version from the tag (#1978)
- (gui) preserve long-press actions when editing a button action (#1876)
- (hid) keep long-only HID++ collections long-only on Windows (#1983)
- (device) stop a cached probe from hiding a dead direct channel (#1979)
- (hook) log both windows when the pointer gate rejects a keyboard action (#1966)
- (release) load only the Codex fields 1Password holds and surface why notes fall back (#1987)
- (macos) switch Spaces through the user's shortcut so the Dock slides (#1847)
- (macos) carry integer wheel ticks on synthetic line scroll events (#1969)
- (hid) read whole Bolt slot names, from 0x0005 or both codename chunks (#1962)
- (linux) stop counting our own pass-through mouse in the input access probe (#1971)
- macOS: shortcut keys go through a virtual HID keyboard. When a button sends a keyboard shortcut, the signed OpenLogi Agent presses the keys on a virtual keyboard named "OpenLogi Virtual Keyboard". macOS handles them as keys from a USB keyboard. This targets shortcuts that work from a real keyboard but did not work from OpenLogi (#1653, #744). Apple granted OpenLogi the restricted HID virtual-device entitlement for this (#1918, #1929). No new permission is needed. Builds from source, and a system that does not let the agent create the device, type keys as before.
- (pointer) light the DPI LED in precision mode (#1934)
- (pointer) precision mode on mice with adjustable DPI (#1932)
- (release) ship Sparkle delta updates (#1925)
- (core,agent,gui) pointer speed and precision mode for 0x2205 mice (#1922)
- (xtask,ci) sign the macOS agent with its HID virtual-device profile (#1929)
- (macos,gui) say when Secure Input pauses key remapping (#1926)
- (inject,gui) slide desktop switches like a three-finger swipe (#1921)
- (inject) type synthesized macOS keys through a virtual HID keyboard (#1918)
- (hidpp) publish the 0x8071 nv-effect sync event as raw bytes (#1951)
- (core,device,agent,gui) choose the receiver before pairing a device (#1614)
- (hidpp,device) read the 0x2201 default DPI only from feature version 1 (#1952)
- (device) read the 0x1000 battery capability before mapping levels (#1938)
- (hidpp,device) publish 0x1b04 reporting changes made by other clients (#1946)
- (hidpp) decode unified battery status bytes 3-5 by feature version (#1941)
- (device) drop short 0x2121 movements and re-read SmartShift on a ratchet switch (#1944)
- (agent) hand the haptic enable back after Actions Ring sessions (#1942)
- (hidpp,device) reconcile DPI after a sensor calibration broadcast (#1947)
- (gui) save a DPI only after the device confirms it (#1943)
- (hidpp,device,cli) keep getFwInfo transport bytes 9-15 raw (#1945)
- (hidpp,device) re-read settings on a 0x4521 disabled-key report (#1940)
- (hidpp) bound 0x2111 torque and refuse a short capabilities reply (#1939)
- (hidpp) gate the illumination effective maximum in its wrapper (#1937)
- (hidpp,device) write all 0x8070 zones safely and gate v1 functions (#1936)
- (device) restore thumb-wheel reporting as found and harden its capture (#1935)
- (hidpp) keep unmodelled backlight option bits on write (#1933)
- (desktop) show Pointer tab for mice and trackballs with software scroll inversion (#1880)
- (device,agent) move linked devices after a keyboard that switches by itself (#1920)
- (deps) bump rustls-webpki and webpki roots for emSign advisories (#1924)
- (agent) relaunch when Input Monitoring is granted after launch (#1919)
- (core,gui) share per-app profiles across platforms with [apps] aliases (#1907)
- (overlay) show an indicator when a keyboard turns a lock key on or off (#1898)
- (overlay) show a notice when a device's battery runs low (#1891)
- (linux) ship a Flatpak bundle with each release (#767)
- (hidpp) add scrolling force control for smartshift enhanced mice (#1636)
- (core,gui) allow middle click gesture mode (#1738)
- (overlay) show keyboard backlight level (#1695)
- (linux) support Hyprland native remaps (#1152)
- (linux) route window-manager native actions through KWin D-Bus on KDE (#1087)
- (gui) show the receiver slot on each device card (#1802)
- (desktop) save a change made on a Litra as its setting (#1870)
- (gui) add Power User actions to the Action Ring editor (#1445)
- (gui) add a Reset to defaults button to the F-key binding panel (#1255)
- (gui) add device default option for keyboard bindings (#702)
- (agent) keep a change made on a Litra as its setting and publish it (#1866)
- (gui) add a Next / Previous Desktop thumb-wheel preset (#1848)
- (device) reach Litra lights over HID++ 0x1990 with read-back (#1841)
- (desktop) add a per-device smooth wheel switch to the Scrolling card (#1839)
- (device) smooth a mouse's main wheel by diverting it (0x2121) (#1837)
- (desktop) offer hold-to-scroll-sideways for Back and Forward (#1835)
- (device) hold Back or Forward to scroll sideways with the main wheel (0x1b04 raw wheel) (#1828)
- (overlay) draw one Actions Ring per display on Wayland (#1906)
- (device) drop a lock-state read that answers after a reconnection (#1899)
- (core,agent) chain swipes within one gesture-button hold (#1652)
- (agent) include MiddleClick in the macOS HID++ gesture ownership (#1380)
- (macos) preserve fractional wheel distance (#1154)
- (i18n) route hardcoded GUI labels through the catalog (#1331)
- (hid) capture the M720 Triathlon's multiplatform gesture button (#1613)
- (gui) fold leftover receiver pairings into one device card (#1801)
- (gui) allow clearing function-key bindings (#962)
- (hid) suppress duplicate Bolt pairing slots (#963)
- (hook) fall back to a recent device attribution on macOS (#805)
- (linux) grab a mouse again after it reconnects or appears late (#1869)
- (linux) keep "pen" out of the uinput device names (#1868)
- (inject) give the Windows Screenshot action its own Win+PrtScn chord (#1867)
- (hid) open HID++ channels concurrently, not one node at a time (#1443)
- (gui) enlarge About panel logo (#1364)
- (gui) embed the Sleep action's moon glyph (#790)
- (linux) report input access as denied when the event node is unreadable (#787)
- (agent) write a light only when a reload changes its settings (#1865)
- (i18n) translate the hold-modifiers and tap-key actions in Czech (#1850)
- (agent) log thumb-wheel continuous-scroll dispatch (#1852)
- (gui) recognize the MX Ergo precision-mode button slot (#1855)
- (cli) drop a paired device with no identity from fixture capture (#1861)
- (gui) retain observed connection icons for offline devices (#1830)
- (gui) show the Actions Ring tab for keyboards with a Keys panel (#1844)
- (desktop) show Easy-Switch hosts on the Device tab and rename them (#1825)
- (device) read Easy-Switch host names and OS, and rename hosts (0x1815) (#1824)
- (desktop) control the keyboard backlight from the Device tab (#1812)
- (device) set keyboard backlight automatic brightness, level and battery saving (#1811)
- (device) adjust the report rate of mice with 0x8060 or 0x8061 (#1808)
- (device) keep multi-platform keyboards on the host OS layout (#1806)
- (camera) name webcams that report no USB product string (#1793)
- (gui) update macOS through Sparkle (#1744)
- (core) add an action that holds modifiers and taps the key once (#1161)
- (gui) add custom-shortcut Tap/Hold recorder to the button picker (#1396)
- (hook) reverse the wheel in software for devices without 0x2121 (#847)
- (gui) add precise camera control entry (#1047)
- (camera) expose pan, tilt, gain and backlight compensation (#1020)
- (device) Detect Logitech G735 headset dongle (#1040)
- (hook) keep the pixel delta when inverting a macOS wheel event (#1827)
- (hook) keep software scroll inversion applied when the agent intercepts the wheel (#1749)
- (overlay) configure accessory policy after GPUI initialization (#1814)
- (agent) hand off capture across receiver routes (#1198)
- (linux) open the Actions Ring at the cursor on Wayland (#1004)
- (agent) queue HID requests before response timeout (#936)
- (agent) anchor the recovery-scan timer to scan start, not scan end (#1809)
- (gui) gate debug diagnostics imports in release builds (#1815)
- (scroll) post phaseless continuous scroll events on macOS (#1157)
- (device) discard the stale first raw-XY report of every gesture hold (#1786)
- (agent) divert a keyboard key explicitly bound to Action::None (#1819)
- (device) don't let a stuck Empty host-slot status refuse a real pairing (#1813)
- (linux) settle the uinput action device before its first emit (#1810)
- (device) refuse haptic plays while 0x19b0 reports a non-zero status (#1817)
- (device) play only the haptic waveforms the device advertises (#1796)
- (device) drive Fn-lock on keyboards that only have 0x40a0 (#1792)
- (device) re-read settings the device changes itself (#1791)
- (hidpp) read a non-BCD 0x0003 firmware version as binary (#1790)
- (hidpp) check the echoed index in 0x8070/0x8071 info and 0x0007 name reads (#1789)
- (device) report no percentage for a 0x1004 battery without a gauge (#1788)
- (device) wait for the Unifying lock to open before searching (#1785)
- (device) reconcile inventory on 0x1000/0x1001 battery broadcasts (#1787)
- (hidpp) treat a Bolt protocol byte in 0x41 as an encrypted link (#1784)
- (hidpp) refuse a short 0x40A3 reply instead of zero-filling it (#1782)
- (hidpp) keep 0x0003 firmware entity types without a name (#1783)
- (hidpp) decode 0x1c00 empty actions and status, and 0x4531 OS bits (#1781)
- (hidpp) decode every 0x2121 capability flag and the horizontal delta (#1780)
- (hidpp) hold 0x8060 and 0x8061 rates to what the features define (#1779)
- (device) end a thumb-wheel roll whose Stop never arrives (#1777)
- (hidpp) require the sensor echo in DPI replies (#1776)
- (agent-core) close the RGB release races left by #1769 (#1770)
- (device) confirm SmartShift writes from the device's reply (#1775)
- (device) confirm the haptic repair from the device's reply (#1773)
- (hidpp) refuse short 0x1990 info and level replies (#1772)
- (hidpp) require the 0x8081 zone echo before reporting a write (#1771)
- (device) own RGB software control for the agent session (#1769)
- (device) stop committing 0x8080 frames the keyboard rejected (#1764)
- (device) stop misreading 0x1000 and 0x1001 battery states (#1768)
- (device) give the Litra Beam its own brightness range (#1763)
- (device) write SmartShift torque and DPI only as the device advertises (#1759)
- (device) encode 0x8080 tail frames and 0x8070 fixed colour per device (#1758)
- (hidpp) preserve device state OpenLogi does not own on writes (#1753)
- (hidpp) write each 0x0007 name chunk at its own offset (#1767)
- (hidpp) read the 0x4530 platform with function 0 (#1766)
- (hidpp) write 0x1990 non-linear level tables whole (#1765)
- (camera) pass the pan/tilt payload by value (#1740)
- (overlay) properly position and scale Actions Ring on Windows mixed-DPI displays (#1745)
- (agent) reapply volatile settings on device reconnection and retry disagreeing DPI writes (#1270)
- (camera) collapse a Brio's IR node into one Linux camera entry (#1234)
- (gui) give MenuRow-based list rows an accessible name (#1448)
- (gui) open the config folder from the fail-closed config screen (#942)
- (inject) give App Expose/Mission Control/Show Desktop/Launchpad a GNOME implementation (#1446)
- (gui) render camera depots that ship no hotspot metadata (#1265)
- (assets) resolve variants for depots whose manifests key on depot name or stem (#1295)
- (inject) send hi-res wheel events for Linux scroll actions (by @RisenID) (#1719)
- (device) omit raw-xy flags when diverting or restoring keyboard controls (#1726)
- (hid) capture alternate gesture controls (#1561)
- (overlay) set the macOS activation policy before gpui_platform starts (#1692)
- (i18n) translate the custom-action input error in Czech (#1728)
- (linux) retain fixture corpus in nix test source
- (agent) honor an overflow cancel from a generation the scroll worker has not seen (#1720)
- (agent) emit scroll input queued across a smoothing toggle instead of dropping it (#1721)
- (windows) enable HID++ side-button gestures (#1635)
- (i18n) use Spain's Spanish terms in the es catalog (#1326)
- (hook) forward low-res wheel events when the hi-res event passes through (#1693)
- (inject) distinguish Linux Capture Region from Screenshot (#1433)
- (gui) draw the client-side titlebar only where the compositor declines one (#945)
- (cli) let macOS prompt for Input Monitoring before diag opens a device (#1256)
- (hook) carry the physical mouse's vendor/product ID onto its uinput mirror (#1453)
- (gui) let the theme card name shrink so the badge fits (#1435)
- (gui) prefer the Buttons panel over Keys when kind resolution is wrong (#1702)
- (hidpp) implement pointer motion scaling (#1347)
- (gui) add custom actions to the mouse picker (#1452)
- (hid) add G733 battery and power-state support (#1601)
- (hid) recognize POWERPLAY receiver (#1267)
- (hook) identify unbundled macos applications (#1469)
- (inject) restore macos 27 space swipes (#1703)
- (gui) show friendly names for Windows app profiles (#1463)
- (core) resolve connection transport from live routes (#1367)
- (gui) restore the config-error folder action (#1458)
- (macos) respect the selected Apple developer directory (#1457)
- (i18n) improve Turkish catalog wording (#1415)
- (agent) repeat thumb-wheel volume actions with swipe distance (#1455)
- (linux) localize desktop entry comment in Spanish (#1468)
- (i18n) add Czech locale (#1669)
- (cli) persist verified automation settings with save
- (macos) preserve pixel precision in synthetic scroll events (#1156)
- (gui) recognize MX Ergo precision-mode button slot (#1391)
- (gui) show wheel controls without adjustable dpi (#1369)
- (cli) show Linux udev guidance for device access failures (#1348)
- (gui) wrap the About page links without clipping (#885)
- (i18n) track locale catalogs as build inputs (#1327)
- (gui) keep the action library scrollbar in its viewport (#1360)
- (agent) fall back to focus when the pointer target is unidentified (#1648)
- (gui) scale configuration labels with interface text (#1627)
- (agent) restore ring toggle and publish expired sessions (#1665)
- (gui) show the actual update host in the consent dialog (#1629)
- (hook) restore the short watchdog budget before tap teardown (#1600)
- (core) preserve symlinked configuration targets (#1642)
- (agent) phase horizontal thumb-wheel scroll when smoothing is off (#1689)
- (hid) exclude foreign reports from fixture captures (#1373)
- (gui) render pointer pairing passkey icons with theme colors (#1640)
- (gui) keep the device toggle visible with long captions (#1670)
- (gui) truncate long function-key names and retain tooltips (#1691)
- (hid) recognize Lightspeed receiver 046d:c541 (#1679)
- (gui) use configured DPI while the live read is unavailable (#1628)
- (core) serialize configuration saves across processes
- (linux) add verified release installer (#1109)
- clear the lints rustc 1.99 raises on untouched code (#1638)
- (core) match Actions Ring layouts with the per-app selector (#643)
- (macos) drive the device-I/O gate from powerd instead of workspace notifications (#1323)
- (macos) confirm desktop switches with private space APIs (#1586)
- (agent) recognize an overlay tenant by any image we ever shipped (#871)
- (macos) press Back and Forward as the frontmost app's menu item (#1622)
- (agent) read privacy grants on notification instead of a 1.2 s poll
- (hook) probe the Accessibility grant on cue, with a heartbeat backstop
- (core) add a Super modifier and make Win/Meta name it (#1387)
- (keyboard) key controls by HID++ control ID, fix Keys tab and Fn-lock (#1604)
- (hook) charge the callback watchdog's first poll from its spawn
- (hook) give the callback watchdog the same watched-time rule
- (hook) discount only the watchdog gaps that spanned a kernel sleep or wake
- (hook) do not charge the tap thread for time the watchdog was not running
- (hook) give the macOS tap's capability probes their own watchdog budget
- (agent) keep the armed-session record whole and clear it on the Quit fallback
- (agent) re-arm a crash respawn instead of going dormant
- (macos) press shortcut keys where the active layout types them (#948)
- (gui) unpair a forgotten receiver device so it stays deleted (#1617)
- (macos) keep the hook from hearing the keys OpenLogi posts (#1618)
- (hook) use AppKit for macOS pointer hit testing (#1568)
- (gui) repair missing launchd agent jobs (#1303)
- (hook) stop leaking GNOME observer sockets (#1418)
- (gui) correct thumb-wheel volume preset labels (#1436)
- (gui) add safe per-app profile reset and complete removal
- (hid) recognise Nano receiver 046d:c534 (MK270, MK295) (#1456)
- (gui) prefer firmware codename over catalog name for M650 variants (#1366)
- (i18n) clarify which app editors close after deletion
- (gui) render profile confirmation dialogs in the main window
- (agent) divert a single-bound gesture button (#1569)
- (agent) default mouse profiles to pointer context
- (hook) expose native pointer window context
- (gui) show installation source in update settings
- (gui) detect installation ownership across platforms
- (xtask) model the Windows test job in the local CI runner
- (core) own the function-row vocabulary in one FunctionKey
- (gui) resolve each device's assets once per asset generation
- (gui) build the asset resolver once at startup
- (agent) log a DPI or SmartShift write only once one is scheduled
- (agent) say why a background write was skipped
- (agent) start the HID++ watchers through one named worker shell
- (xtask) read ci.yml's wrapped commands under either line ending
- (gui) replace the asset resolver after a failed sync too
- (gui) keep a snapped sync off a slider mid-drag
- (gui) show the dragged value beside a lighting slider
- (gui) clamp camera control values through the ordered range
- (gui) re-seat the thumb-wheel sensitivity slider after a rolled-back save
- (cli) stop telling users Unifying receivers are not surfaced
- (cli) tell a timed-out profile capture what to do next
- (ipc) start the handshake deadline before the socket is reached
- (cli) stop naming the agent lock file outside its owner
- (gui) keep the relaunch notice ahead of the unreachable one
- (gui) hold a config reload until the agent connects
- (gui) expose supported button gestures
- (agent) support dpi button gestures
- (gui) declare the alignment bespoke buttons relied on
- (gui) pin ChoiceCard to a column under gpui-kit 0.6
- (gui) require measured raw-xy support for dpi gestures
- (agent) honor per-app overrides for hidpp gestures
- (core) preserve existing middle click gestures
- (hid) preserve warm cache after a failed initial probe
- (inventory) hold unattributed cache entries for a node deferred before its first probe
- (inventory) hold a deferred node's cache entries out of miss aging
- (inventory) take a receiver's register phase before its I/O budget starts
- (hid) every receiver register caller takes the node's register phase
- (hidpp) quarantine an abandoned request's reply even for a byte-identical re-ask
- (inventory) settle a deferred receiver probe without counting a failure
- (hid) defer a receiver probe that cannot take the register-phase lock
- (hidpp) keep an abandoned request's header reserved until its reply lands
- (hid) lease HID++ software ids per node, not per host
- (hidpp) never keep two requests with one reply header in flight
- (hid) serialise a receiver's register phase across OpenLogi processes
- (hid) lease HID++ software ids across OpenLogi processes
- (hidpp) match sub-register reads on the echoed sub-register byte
- (linux) serialise autostart reconciles and claim the marker atomically
- (linux) preserve systemd unit and enablement ownership
- (gui) resolve depot metadata named only by the manifest
- (hid) support cancellation-safe rgb-effects lighting
- (cli) add fixture contribution wizard
- (cli) verify fixture corpus directories
- (cli) capture semantic device profiles
- (device) add fixture identity ledger
- (cli) record privacy-safe fixture cases
- (agent) add injectable hardware context
- (agent) complete semantic profile reads
- (hid) build sanitized cassettes from recordings
- (device) add deterministic replay barriers
- (device) add canonical synthetic profile
- (agent) drive mock from device profiles
- (device) complete semantic device profiles
- (hid) add bounded native traffic recording
- (hid) add strict device replay foundation
- (hidpp) add channel observation API
- (gui) add snapshot projection boundary
- (i18n) migrate catalogs to semantic TOML keys (#1169)
- (i18n) avoid copying borrowed translations (#1184)
- (gui) keep update consent buttons visible
- (cli) select rgb devices through receiver routes
- (camera) require a stored frame before reporting startup
- (gui) retry a camera preview that failed to start
- (camera) refuse a camera another application is streaming
- (deps) update rustls to address RUSTSEC-2026-0285
- (macos) preserve device isolation and harden Safari dispatch
- (macos) bind Safari navigation to press-time process
- (cli) enforce fixture corpus and capture safety checks
- (hid) enforce receiver slot state during cassette replay
- (fixture) enforce read-only protocol and case relationships
- (cli) hold agent ownership throughout fixture capture
- (cli) use shared fixture identity policy
- (hid) retain suspended open evidence
- (hid) reject unknown nested fixture fields
- (gui) stop linking SMAppServiceErrorDomain so macOS 13 and 14 can launch
- (gui) place Windows actions ring in physical monitor coordinates (#1319)
- (agent) avoid capture recovery deadline busy loops (#1321)
- (agent) fence queued pairing discovery after selection (#1320)
- (core) stop seeding Back/Forward with a divertable default (#1225)
- (linux) declare F13-F20 in uinput key capabilities (#1224)
- (agent) keep terminal exit responsive during replacement
- (agent) recover host-switch controls across channel retirement
- (agent) restore diverted controls before process exit
- (hook) normalize Windows cursor position to DIP scale (#1246)
- add Debian runtime dependencies (#1249)
- (i18n) correct mistranslations in the Spanish catalog (#1315)
- (docs) fix typo in installation guide (#1189)
- (hid) keep pairing phase after device selection (#1181)
- (i18n) refine French asset and control descriptions (#1278)
- (i18n) polish Brazilian Portuguese profile and settings copy (#1276)
- (i18n) avoid repeating device headings in count captions
- (i18n) localize DPI steps and correct count labels
- (i18n) polish supported locale copy (#1180)
- (ci) repair focused i18n gate and agent guidance (#1138)
- make Actions Ring selectable in action pickers (#958)
- (ci) align agent guidance with current contracts (#1139)
- (agent) dispatch independent long-press actions (#961)
- (gui) expose smooth scroll control
- (gui) persist smooth scroll setting
- (gui) add vertical scroll sensitivity control
- (agent) apply vertical wheel sensitivity
- (core) add vertical scroll sensitivity setting
- (gui) rework the card corners and add a device action menu
- (gui) articulate the app picker's catalog section
- (agent) smooth diverted thumbwheel input
- (agent) smooth physical wheel input
- (agent) add finite smooth scroll runtime
- (inject) add phased smooth scroll output
- (core) add smooth scroll preference
- (inject) preserve fractional wheel output
- (gui) add polished battery indicator (#983)
- (gui) add installed application catalog picker (#976)
- (agent) hold shortcut output until button release
- (gui) add debug component gallery
- (gui) add switchable device gallery views
- (gui) replace device carousel with responsive grid
- (core) persist custom device names
- (i18n) add Turkish (tr) interface locale (#835)
- (agent) unify button lifecycle
- (gui) add scalable interface presets
- (gui) make custom controls keyboard-operable (#916)
- (gui) redesign device configuration workspace
- (gui) edit per-app button profiles
- (gui) give the binding panels an editing scope
- (core) expose the per-app overlays an editor needs
- (gui) show which per-app profile is in effect
- (ipc) report the foreground application in the agent snapshot
- (core) add the foreground-application type
- (core,gui) make the main wheel's tilt rebindable (MX anywhere 2s,...) (#902)
- (agent) park idle scroll worker
- (hid) preserve diverted wheel reporting (#992)
- (core,gui,agent) key device settings by identity, not by transport (#876)
- (gui) type permission badge elements
- (gui) close macos render lifetime
- (gui) restore rejected scroll sensitivity
- (gui) fail closed when forgetting a device cannot be saved
- (gui) pin small form controls to the 30 px control height
- (gui) drop popover chrome behind the app picker panel
- (gui) resolve app icons asynchronously as raw bitmaps
- (agent) keep saturated scroll cancellation source-local
- (agent) balance concurrent scroll phases
- (agent) preserve fractional thumbwheel distance
- (macos) preserve fractional wheel deltas
- (thumbwheel) scale remapped vertical scrolling (#925)
- (macos) retain shared held-key ownership
- (hook) fail open rejected key releases
- (agent) preserve held shortcut lifecycles
- (gui) remove stale macos trait imports
- (gui) make custom controls keyboard accessible
- (infra) speed up orb setup
- (i18n) add Turkish device gallery strings
- (gui) distinguish same-model cameras
- (gui) keep pointer card widths consistent
- (gui) wait for SmartShift confirmation
- (hidpp) read Unifying link encryption from bit 5, not the software-present bit (#924)
- show Windows MSI completion and failure state (#819)
- (hid) preserve usage pairs in native handle cache (#882)
- (macos) use reliable async-hid report writes (#889)
- (gui) adapt profile editors to state events
- (gui) let device summary text fill its row
- (gui) apply semantic colors to custom controls
- (gui) avoid reentering mouse view during render
- (hid) skip the arrival retry on a receiver with no pairings
- (hid) settle a failed notification-flag write as a failed probe
- (hid) honor the arrival event's link status in the Unifying slot probe
- (hidpp) correct 0x41 re-broadcast semantics and expose decoding
- (hid) trust live Unifying arrival events
- (hid) fail fast on unresponsive receivers
- (macos) honor XDG state dir in permission diagnostics (#915)
- (gui) restore full-phrase thumb-wheel preset labels (#913)
- (linux) restore glibc 2.35 package baseline (#911)
- (mouse) compose thumb-wheel preset labels from translated action names (#910)
- (gui) update app state through sync context
- (gui) recognize mx ergo wheel tilt metadata (#905)
- (linux) install the app icon at every indexed hicolor size (#837)
- (release) publish the complete crates.io dependency closure
- (release) ignore stale release pull requests during changelog post-processing
- (cli) read the running agent's inventory in openlogi list (#823)
- (ipc) surface HID open failures in agent status (#822)
- (overlay,agent) stop the anonymous overlay tenant from wedging the Actions Ring (#848)
- (gui) stop discarding correctly rebuilt device records (#868)
- (thumbwheel) stop the tap firing App Exposé, and scroll by the wheel's native amount (#857)
- (agent) follow the picked app icon in the menu bar (#846)
- (nix) provide git to the sandboxed test phase (#833)
- (gui) check the open helper's exit status when launching the agent (#820)
- (cli) read the running agent's inventory in openlogi list (#823)
- (ipc) surface HID open failures in agent status (#822)
- (thumbwheel) stop the tap firing App Exposé, and scroll by the wheel's native amount (#857)
- (agent) follow the picked app icon in the menu bar (#846)
- (nix) provide git to the sandboxed test phase (#833)
- (gui) check the open helper's exit status when launching the agent (#820)
0.7.5 and 0.7.6 were tagged but never published — their macOS packaging failed before any artifact was uploaded — so everything they contained ships here.
- (hid) recognise Lightspeed receiver 046d:c54d (PRO X SUPERLIGHT 2 DEX) (#811)
- (gui) wear and pick the app icon
- (core) persist which app icon the user picked
- (camera) add anti-flicker and low-light controls (#793)
- (cli) report feature flags and firmware entities in diag features (#690)
- (i18n) add Ukrainian (uk) locale (#715)
- (ci) build both macOS legs with an Icon Composer-capable Xcode (#815)
- (agent) make macOS permission failures diagnosable (#817)
- (release) trust release-plz no-op results
- (release) use changelog as release PR body
- (hid) park the Windows HID read on a permanently dead handle (#779)
- (hid) take async-hid 0.5.3 so a denied HID open stops leaking (#804)
- (ipc) surface Input Monitoring via agent status and fix registry_model_id bincode (#760)
- (agent) an unreadable stat breaks the absence run
- (agent) only confirmed absence may condemn the agent
- (agent) shut down when the app is uninstalled
- (gui) only wear an app icon the config kept
- (hook) keep macOS tap lifecycle instance-owned
- (hook) keep the idempotent re-enable, budget only the OS-driven one
- (agent) release the input hook on SIGTERM and SIGINT
- (hook) detect Accessibility revocation with a live tap probe
- (ci) make the wasm job's drift check independent of the host
- (xtask) skip the ci.yml drift tests where CI metadata is absent
- (hid) support G602 nano receiver (#684)
- (hid) surface the 0xc539 dongle as a Lightspeed receiver, not Unifying (#665)
- (ci) make the MSRV job actually pin the toolchain it installs
- (camera) finish the 1.98 chunks_exact sweep in the platform backends
- satisfy the lints Rust 1.98 added
- (xtask) build the overlay the Linux package installs
- (ipc) identify each agent run behind a frozen handshake
- (gui) stop scanning for cameras with no window open
- (overlay) prevent GPUI from exiting on window close (#700)
- (gui) give the auxiliary windows the app's real Wayland identity
- (gui) use the GPUI executor timer, not tokio::time::interval, for camera scans (#686)
- (overlay) use the workspace's Duration idioms for the give-up clock
- (agent) ask the overlay to leave before quitting
- (overlay) give up when no agent answers for a minute
- (core) resolve the binding module's intra-doc links
- (core) keep dev builds on the dev profile after the suffix rename
- (agent) supervise the overlay role instead of launching into it
- (gui) bind the Actions Ring overlay to one agent run
- (agent) reapply volatile settings after Windows resume (#639)
- (gui) add a reversed Volume preset for the thumb wheel (#608)
- (agent) request Input Monitoring access at startup on macOS (#607)
- (infra) stop ignoring the committed Amp orb lifecycle scripts (#637)
- (assets) trust the OS certificate store, not bundled Mozilla roots (#634)
- (hid) never switch a device to a host slot it is not paired on (#631)
A minor bump rather than a patch: your config.toml is now read strictly and
never silently replaced, and the GUI↔agent protocol moved to v17. Both change
observable behaviour, so they do not belong in a patch release.
- Your config is no longer silently discarded. A malformed, hand-edited, or
future-schema
config.tomlused to fall back to defaults without saying so — losing every binding in it. It is now parsed strictly (unknown, obsolete, and out-of-range fields are rejected with the file path and TOML location), and the failure is shown in the window instead of being papered over. Saves keep your comments and formatting, and a file edited behind OpenLogi's back is refused rather than overwritten. - Mice and keyboards that speak only the newer HID++ features work now. A
mouse exposing
0x2202 ExtendedAdjustableDpiwithout the older0x2201used to get a DPI panel where every read and write failed; a keyboard exposing0x8081 PerKeyLighting2without0x8080got no lighting tab at all. Both are driven properly. (#629) - The Actions Ring is reliable under repeat use. Haptics no longer fire from a retired session, a stale feature handle can no longer be reused across a reconnect, and the ring stays alive as long as it is clickable. (#596, #597, #598, #599)
- Windows camera control stops leaking. Every COM and Media Foundation initialization is now paired with its release, and a UVC entity scan stays inside its own VideoControl block instead of walking into a neighbour's.
schema_versionis4; v1–v4 configs still migrate automatically. A config that fails to parse now surfaces an error rather than resetting to defaults — see Editing and recovery if OpenLogi reports one.docs/config.example.tomlis a tested canonical example.- The GUI and agent negotiate protocol v17. A stale agent left running from an older install is detected and replaced; no action is needed.
- (gui) build fallbacks lazily
- (config) harden schema and persistence (#604)
- (hid) drive 0x2202 DPI and 0x8081 lighting, not just their predecessors (#629)
- (release) put openlogi-camera in the workspace version group (#618)
- (agent) bound the background lighting write by WRITE_BUDGET
- (camera) pair every COM and Media Foundation initialization
- (camera) scope a UVC entity scan to its own VideoControl block
- (camera) release every activate Media Foundation hands back
- keep the ring session alive as long as the ring is clickable (#599)
- (agent) bound the Actions Ring haptic worker to the session it serves (#598)
- (hid) never cache a haptic feature for a retired channel (#597)
- (hid) four defects from the Actions Ring review (#596)
- (xtask) stamp and verify the macOS bundle identity per channel
- (gui) dismiss the Actions Ring on a click outside it (#591)
- (agent) pressing the ring trigger again dismisses the Actions Ring (#592)
- (agent) add a hardware-free mock agent for GUI development (#568)
- per-slot custom labels for the Actions Ring (#584)
- (core) support stable Windows app selectors (#572)
- (gui) add capability-driven actions ring (#528)
- (hid) persist the immutable probe cache across restarts (#564)
- (gui) back navigation via the mouse's back button and Alt+Left (#563)
- capture the MX Master 4 haptic panel as a first-class control (#565)
- (hid) recognise Lightspeed receiver 046d:c547 (G915, G502 X) (#574)
- (hid,hidpp) read battery over BatteryVoltage (0x1001) (#575)
- (gui) open the Actions Ring on the display containing the cursor (#588)
- (hid) detect and recover dead-delivery HID channels (#589)
- Actions Ring haptic reliability — coalescing, feature cache, firmware arming, deadlock guards (#590)
- (agent) implement the Actions Ring IPC surface in the mock agent (#587)
- (gui) redraw the Actions Ring on hover changes (#585)
- (hid) widen the Bolt per-slot probe budget for high-latency USB paths (#562)
- (macos) prevent corrupted small app icons (#570)
- (hook) release macOS tap after accessibility revocation (#578)
- (ui) prevent middle and thumb wheel popover flicker (#559)
- (macos) add camera hardened-runtime entitlement (#557)
- per-device capture with plan-driven sessions (#419)
- (hid) recognise Lightspeed nano receivers (G-series, e.g. G305) (#388)
- add MX Master 2S (3S) thumb wheel bindings (#525)
- (i18n) add camera permission locale keys (#554)
- (hook) capture keyboard events on windows (#548)
- (gui,camera,xtask) make Camera permission grantable on macOS (#550)
- (ci) merge Crowdin downloads into locale catalogs (#553)
- (i18n) skip Crowdin English fill-in and restore locale parity (#551)
- (hidpp) retry lost feature-table reads during enumeration (#469)
- (gui,assets) fit the Keys tab to legacy keyboard assets (G513) (#544)
- (hid) recognize Lightspeed receiver (046d:c539) as Unifying-compatible (#510)
- add function key remapper (#344)
- (hid) add standalone Litra light support (#513)
- keyboard F-row key remapping and fn-lock over HID++ (#395)
- (hook) Wayland frontmost-window backends (wlroots + GNOME Shell) (#191)
- (camera) add Logitech webcam support (#531)
- (backlight) support HID++ 0x1982 (#470)
- (battery) support legacy 0x1000 BatteryStatus and its charging quirk (#312)
- (agent-core) retry volatile DPI re-apply on cold boot (#449)
- (agent) prefer online device for input capture (#453)
- (hidpp) keep events when a field carries an unknown enum value (#432)
- (agent) rearm control capture after device reconnect (#450)
- (linux) grant uaccess on Logitech input event nodes (#530)
- (agent) reapply volatile settings after macOS resume (#506)
- (hook) never wedge system pointer input (#534)
- (agent) route hardware operations through inventory channels (#532)
- (agent) reuse inventory channels for input capture (#522)
- (i18n) complete Crowdin synchronization (#508)
0.6.23 - 2026-08-02
- (hook) grab only relative pointer devices, never touchpads or pointing sticks (#401)
0.6.22 - 2026-07-21
- (gui) add asset source selector
- (gui) label the official asset source as OpenLogi
- (core) describe selected asset source
0.6.21 - 2026-07-19
- (hid) add native wheel resolution control
- (hid) make one-shot enumerate retry transport-agnostic so Unifying partial drains recover (#287)
- (core) add hires_wheel to the inventory equality test helper (#417)
0.6.20 - 2026-07-18
- (core) preserve hash-prefixed lighting colors
- (core,gui,agent,cli) validate the lighting color once as a typed Rgb
- (smartshift) stop runaway free-spin scroll and control snap-back (#333)
- (core) document the remaining public items and deny missing_docs
- (core) move the swipe-gesture machinery to binding/swipe.rs
- (core) persist the config through atomic-write-file
- (agent,core) resolve the LaunchAgents path via core paths
- replace assert!(matches!(…)) with std assert_matches
- (core) split config.rs into settings and device submodules
- (core) drop fs4 in favor of std File::try_lock
0.6.19 - 2026-07-04
- (windows) notification-area tray icon for the agent (#347)
- (windows) bundle and package the background agent (#347)
0.6.18 - 2026-06-29
- (hidpp) add typed reprog controls support
- Clarify MX Master 4 gesture control semantics (#325)
0.6.17 - 2026-06-24
- add Capture Region to Clipboard button action (#296)
0.6.16 - 2026-06-22
- (scroll) support per-device inversion
- (scroll) require native hidpp inversion
- (config) key settings by physical device
- (infra) use crates for paths and language matching
0.6.15 - 2026-06-21
- (scroll) per-device inverted scrolling (#126)
0.6.14 - 2026-06-15
- (hid) solid keyboard colour via 0x8070 effect (#205)
- (core) extract the OS input-injection layer into openlogi-inject (#240)
0.6.13 - 2026-06-15
- (hidpp) address review — multi-impl macro arm + 4-bit function guard
- (hidpp) fold per-feature request framing into FeatureEndpoint
- (hidpp) express the feature registry as a data macro
0.6.12 - 2026-06-13
- (gui) keep asleep devices and their panels in the device list
- (agent) persist DPI/SmartShift per device and reapply volatile settings on reconnect
0.6.11 - 2026-06-13
- (hid) replay a node's last inventory through transient probe failures (#222)
0.6.10 - 2026-06-13
- (config) add auto_download_assets app setting
- (gui) keep the diagnostics report truthful across agent restarts (#230)
0.6.9 - 2026-06-12
- (gui) add a Copy Diagnostics button to the About window (#206)
0.6.8 - 2026-06-12
- (linux) launch_at_login + input device access permission check (#172)
- add mouse button 4 and 5 options (#96)
0.6.7 - 2026-06-12
- (core) post macOS volume and media keys as NX system-defined events (#184)
- (ipc) pin the wire format with golden bytes and mark wire types
0.6.6 - 2026-06-10
- (hidpp) bound device-controlled name lengths in Bolt parsing (#200)
0.6.5 - 2026-06-10
- collapse nested ifs flagged by current stable clippy (#197)
0.6.4 - 2026-06-10
- (core) complete the macOS->Windows CustomShortcut keycode map
- (windows) native input + HID++ leaf support
- (openlogi-gui) expand UI to 19 fully-translated locales (#24)
- (gui) glow keyboard card in lighting colour (#185)
0.6.3 - 2026-06-09
- (core) unify button + gesture bindings into one Binding map
- (core) harden gesture Binding defaults, migration, and projection
0.6.2 - 2026-06-08
- (i18n) integrate Crowdin localization workflow (#174)
- switch release notes generation to Codex (#177)
- add code of conduct
0.6.1 - 2026-06-08
- (cli) diag selects a device that exposes the feature under test (#150)
0.6.0 - 2026-06-07
- (agent) tarpc IPC server backed by the orchestrator + device I/O
- (agent) define tarpc IPC service contract + serde-derive wire types
- (agent) give the agent its own single-instance lock
- Merge origin/master into feat/agent-daemon-split
0.5.3 - 2026-06-06
- (gui) prefer asset-registry kind + harden device-kind classification
- gate config panels on HID++ capabilities, not device kind
0.5.2 - 2026-06-05
- (core) LockScreen and media actions via D-Bus on Linux
- (core) expose action_device_path for evtest attachment
- (core) implement Action::execute on Linux via uinput
- enable Thumb Wheel Up/Down mapping, "Do Nothing" action, and native scroll sensitivity (#125)
- (core) fmt + clarify mpris fallback log on the Linux D-Bus code
- (core) address PR #124 review comments
- (core) drop unused REL_X/REL_Y from the action uinput device
- (core) cover Action::None in execute_linux
- (core) address PR review comments
- (core) use enumerate_dev_nodes_blocking for correct event path
- (core) address code review findings
- run clippy on Windows instead of bare cargo check (#146)
- (core) simplify D-Bus helpers and add -v flag to inject_action
- (core) simplify inject_action parsing, guard --delay
- (core) extract KEY_CAPABILITIES const, drop too_many_lines allow
- (core) note LockScreen Linux limitation and D-Bus follow-up
- (core) note Ctrl+Shift+Z vs Ctrl+Y redo shortcut choice on Linux
- (core) clarify scroll unit difference between post_horizontal_scroll and HorizontalScroll* actions
- (core) simplify Linux execute helpers and doc fixes
- (core) add vk_mapping tests and inject_action example
0.5.1 - 2026-06-05
- (assets) match devices against every model id a depot lists
- (assets) lock the index.json modelIds schema contract
0.5.0 - 2026-06-05
- add wired G-series keyboard RGB control (#29)
0.4.1 - 2026-06-03
- (gui) refine device gallery worktree changes
- (nix) wire passthru.updateScript for nix-update / autobump
- (nix) add nixpkgs package + flake; commit the prebuilt app icon
- route issue-chooser questions to GitHub Discussions
- update Telegram invite link to the new channel
- (release) disable homebrew-tap dispatch (openlogi moved to homebrew-cask) (#105)
- add GitHub issue form templates (#102)
- configure release-plz branch prefix
0.4.0 - 2026-06-02
- (i18n) add zh-TW (Traditional Chinese, Taiwan) locale (#57)
0.3.4 - 2026-06-01
- (openlogi-hidpp) vendor the hidpp 0.3 fork from lus/logy
- address /code-review findings (write timeouts, scanning fallback, asset sync, CoreBluetooth safety)
- (hidpp) up-convert short→long inside the channel for long-only BLE
0.3.3 - 2026-06-01
- (assets) match devices by displayName when no PID lookup hits
0.3.2 - 2026-06-01
- simplify format
0.3.1 - 2026-06-01
- (updater) use static R2 manifest (#43)
0.3.0 - 2026-06-01
- (openlogi-gui) add Russian localization and language select (#38)
- (gui) stabilize device tab ordering (#37)
0.2.0 - 2026-05-31
- (openlogi-hid) route HID++ writes to directly-attached devices (#5)
0.1.4 - 2026-05-31
- update workflow actions for Node 24
- (release-plz) fail loudly when a release silently stalls
0.1.3 - 2026-05-31
- macOS menu-bar (tray) app: lives in the menu bar with the interactive mouse diagram, a mappable gesture-button hotspot, and live Open / Quit
- Dynamic Dock + menu-bar presence — full window with the app menu when open, tray-only once the window is closed; optional silent start-minimized on login
- "Show in menu bar" setting to keep OpenLogi in the menu bar, or run it as an ordinary Dock app instead
- ⌘W closes the focused window
- Use the real Xcode toolchain for GUI builds and build the installer DMG correctly
0.1.2 - 2026-05-31
- Check for Updates in the About window, backed by the gpui-updater crate
- One opt-in update check on launch, with a first-run prompt to enable it
- Live download progress, and a clickable version that links to its GitHub release
0.1.1 - 2026-05-30
- (release-plz) write a single root changelog, not one per crate
- (release-plz) load CARGO_REGISTRY_TOKEN from 1Password