Releases: itabajah/duja
Release list
v0.1.6
Windows is the released platform. macOS and Linux ship as previews.
Windows:
duja-setup-<version>.exeandduja-<version>-windows-x64.zip
are the released build. Developed and QA'd on real hardware.macOS (
.dmg) and Linux (.tar.gz) are unverified previews. They
are built, staged, checksummed, minisigned and provenance-attested by the same
pipeline as the Windows artifacts, and no one has ever run either one on the
hardware it targets. Every backend on those two platforms is verified by
types, pure tests, CI and cross-referenced primary sources only. Expect
defects that no amount of that catches.On Linux, run
dujactl doctorfirst. It prints the display server it
found, whether overlay dimming and gamma dimming are available this session,
and the displays it can see, so a missingi2c-devmodule or an unusable
compositor says so instead of looking like a hang. Two things it does not
tell you: whether your desktop has aStatusNotifierItemhost (without one
the tray icon simply never appears, and nothing reports that), and anything
about macOS, where the report is display information only.If a screen is left dim or discoloured, how you recover depends on the
transport, and it is worth reading before you need it:
- X11:
duja --restoreresets the gamma on every CRTC of your X screen.- Wayland:
duja --restorehas nothing to do and says so. It is not
broken - awlr-gamma-controlramp lives only as long as the process that
set it, so killing Duja is the recovery, and the compositor puts the
output back by itself even after a hard kill.- macOS:
duja --restoreis the only route, and there is no automatic
crash recovery behind it - the crash marker the other platforms write is
not written there. Both binaries live inside
Duja.app/Contents/MacOS/, so neither is on yourPATHwithout a symlink.Reports are the point of shipping these. A
quirk report
from a real Mac or a real Linux desktop is what moves those platforms off
preview. See SECURITY.md
for how to verify a download first.
[0.1.6] - 2026-08-08
Added
- app,dujactl: Open real macOS displays instead of stubbing them out (#90)
- platform,app: MacOS tray anchor geometry and the anchor-unit contract (#91)
- platform,app: Give the tray's OS hooks a macOS half (#99)
- app: Add the macOS gamma sink (#100)
- app: Run the tray on macOS (#102)
- xtask,ci: Package a universal Duja.app and ship it in a DMG (#104)
- core,panel,ddc,app: Give a macOS built-in panel its geometry (#105)
- core,ddc,panel,app: Drive linux monitors and backlights (#116)
- platform: Give linux an event pump, autostart and a browser (#118)
- dimmer: Decide what a linux session can dim, without naming one (#119)
- ddc,dujactl: Tell a linux user why their monitors are missing (#120)
- dimmer,panel,app: Give a linux display the rectangle it sits on (#122)
- dimmer: Give an x11 session a real overlay (#123)
- dimmer,app: Give an x11 session the sub-floor gamma channel (#124)
- dimmer: Put a layer-shell overlay on the wire (#130)
- dimmer: Give a wayland session its own gamma channel (#131)
- platform: Give the linux tray flyout a real x11 anchor (#132)
- app: Give linux the tray it has been building toward (#136)
- xtask: Give linux a shippable artifact (#140)
- app: Build the soak harness two perf budgets have cited since P4 (#146)
Changed
- app: Split the tray.rs god-module (#81)
- platform,app: Hoist the tray geometry into duja-platform
- app: Build the tray once the event loop is running (#94)
- core,ui,app: Drain the p6 checkpoint debt (#111)
- app: Give the tray a seam before it gains a second backend (#134)
Documentation
- status: Record the structural wave and refresh the test count (#83)
- status: Record P6 wave 2 and the two live-install defects (#97)
- ddc: Record why the macos edid skip must not consume a service (#108)
- Correct six release and support claims the p6 gate falsified (#110)
- status: Record the p6 gate results and close the phase (#112)
- adr: Decide the two reserved linux ADRs, and a third P7 forces (#115)
- deps: Decline x11rb 0.14 and record it as ADR-0023 (#129)
- Split the two files that had grown past being readable (#135)
- Re-triage what wave 5 changed, and drain the row it was told to (#137)
- Close p7 with the gate run and both releases held (#142)
- Plan p8, and say up front that v1.0.0 will be held (#143)
- Ship the ports as previews, and label them where a user looks
- Land what ADR-0024 made false, and shed 244 lines from plan.md
Fixed
- platform: Latch the macOS pump stop so a pre-run request is not lost
- app: Make --restore work on macOS, and say what it actually resets
- dujactl: Merge the built-in panel instead of listing it twice (#92)
- dujactl: Make doctor --report emit the report the docs promise (#95)
- dimmer,app: Fall back to overlay when Windows refuses a gamma ramp (#96)
- ddc,app: Stamp the mirror surface, not the display, on macOS (#98)
- dimmer,ui,app: Gate both gamma captions on the OS that has the limit (#103)
- ddc: Frame apple silicon ddc requests the way displays expect (#106)
- app: Stop a stale panic ack from greying a healthy display (#107)
- app: Re-assert gamma after the OS resets it (#109)
- platform: Harden the unix socket takeover and its state directory (#114)
- dimmer: An x11 overlay with no compositor is a black screen (#121)
- docs,ci: Repair 140 mojibake characters and a false lint rationale (#133)
- ui: A linux user was being told about a macos hardware quirk (#138)
- platform: Bound the x11 anchor now that it runs on the ui thread (#139)
- app: A clean quit no longer flattens gamma Duja never touched (#147)
- core: SECURITY.md promised a config size cap that never existed (#148)
- app: The soak printed to a console a release build does not have (#149)
Performance
- app: Recover 3.9 MB of binary, and gate it so it stays recovered (#144)
Testing
v0.1.5
v0.1.4
v0.1.3
v0.1.2
[0.1.2] - 2026-07-18
Fixed
- ui: Preserve per-monitor offsets in Link all (#57)
- ddc: Classify internal panels and dedup against WMI (#58)
- ui: Make linked-slider fan-out instant instead of gliding (#60)
- engine: Downgrade no-hardware displays to software-only (#59)
- ddc: Enumerate every physical panel in mirror mode (#61)
- ddc,engine: Bound the mirror probe and clear software-forced on reattach (#62)
v0.1.1
[0.1.1] - 2026-07-17
Fixed
- dujactl: Reconnect per request so
set allworks over ipc (#46) - ci: Harden the release pipeline and document the runbook (#47)
- app: Make worker lifecycle safe on detach, open-failure, and quit (#48)
- app: Four correctness fixes in the tray/runtime glue (#51)
- ui: Stop the drag-retarget, reset, and grip bugs in the flyout/settings (#52)
- core: Key the serial-less display id on the EDID base block only (#50)
- dimmer: Stop overlay leaks, preserve the crash marker, bound the UI wait (#49)
- app: Keep the HDR gamma verdict live and preserve the marker on quit (#53)
- ddc: Floor a hardware-reported continuous max at 1; pin the verify tolerance (#54)
- platform,app: Verify the pipe server's identity; add an installer guard (#55)
v0.1.0
[0.1.0] - 2026-07-16
Added
- core: Domain model wave 1 — trait, identity, continuum, debounce, fakes (#4)
- core: Manager, sync groups, config, caps parser, quirks db, fuzz targets (#5)
- platform: Windows event pump for display/power/session events (#7)
- panel,ipc: Wmi internal-panel backend + ipc protocol and framing (#8)
- app: Concurrency engine — controller actor, workers, watchdog (#9)
- ddc: Windows dxva2 backend with transport-abstracted controller (#10)
- app,ctl: P3 integration — headless assembly, stress harness, dujactl dev driver (#11)
- ui: Slint flyout, pure view-models, and ci gui deps (#13)
- dimmer: Windows overlay dimmer, gamma guard, crash marker (p4) (#14)
- app: Assemble the tray application — continuum, dimmer wiring, config, tray+flyout (#15)
- app,core,ddc,ctl: Global hotkeys and vcp 0x60 input switching (#17)
- ipc,platform,app,ctl: Hardened named-pipe transport and dujactl over ipc (#18)
- ui,app,platform,core: Settings window, autostart, opt-in update check (#19)
- panel: Macos displayservices backend for internal panels (#21)
- platform: Unix-domain-socket ipc transport for macos/linux (#22)
- dimmer: Add macos overlay + gamma backend (#23)
- ddc: Macos ddc/ci backend — pure codec, ioavservice + intel i2c (#25)
- platform: Macos backend — pump, single-instance, autostart (#24)
- ui: Premium redesign + dimming toggle, close, functional hotkeys (#28)
- core: Perceptual brightness continuum (v2) (#33)
- app: Wire the perceptual continuum + calibration UI (#34)
- app: Reflect external brightness changes onto the slider (#35)
- ui: Premium slider — two markers, glide, bubble, gradient (#36)
- ui: Ruby theme, flyout header/scroll, resizable settings (#39)
- ui: Accent colour themes and one shared icon for tray and taskbar (#41)
- app: Static faceted-gem whirlpool icon for the executable (#42)
- app: Ship v0.1.0 with installer, signed releases, smart updates (#43)
Documentation
- adr: Record P1 spike verdicts — own ddc backend, software renderer (#3)
- status: Record p6 wave-1 merge and live hardware qa (#26)
- status: Sync test count and record the UI overhaul merge (#40)
- security: Publish the minisign public key for v0.1.0 (#44)
Fixed
- ci: Satisfy cargo-deny wildcard ban for internal path deps
- core: Close P2 gate findings — contract sanity, sync-offset persistence, v0 migration (#6)
- app,panel,core: Close p3 gate findings — restore, debounce, com affinity, ack gating, twin routing (#12)
- app,ui,dimmer: Close p4 gate findings — throttle final-value, gamma wiring (#16)
- platform,app: Close p5 gate findings and record the gate results (#20)
- ui: Close five P0 live-QA defects in the tray app (#27)
- ui: Root-cause fractional-DPI layout + close four live-QA regressions (#29)
- ui: Round-4 - no partial paint, no launch dim, slim pill, borders (#30)
- ui: Present the full window on every show (first-paint bug) (#32)
- ci: Sign releases with pinned minisign 0.12, not choco 0.8.0 (#45)