Repository navigation
OpenHardwareOS v0.1.3 — Windows 与 Linux 预览版
Pre-releaseOpenHardwareOS v0.1.3 is the first release with a Linux artefact alongside Windows: a prebuilt x86_64 CLI that needs neither Rust nor Node.js. Existing v0.1.0, v0.1.1 and v0.1.2 tags and downloads remain available.
Changes
Control foundations — three defects found by source review, fixed and pinned by tests
- A provider is chosen by what is actually there. NVML used to be dropped whenever the settings merely enabled LibreHardwareMonitor, so a machine without LHM running (Linux, or Windows with LHM closed) had no GPU provider at all and nothing said why. An adapter now declares which provider it stands by for (
AdapterInfo::yields_to) and the runtime decides from the probe, on every discovery cycle. - Channel identity no longer rests on coincidence. The LibreHardwareMonitor mapping keyed both sides of a fan channel into one map, so two sensors with the same number silently replaced one another, and a tachometer named
Fan #1could be paired with a control numbered by its position — an enumeration artefact, not an identity, on the channel rules write to. Nothing is merged now, anchors are explicit, and a channel whose control cannot be shown to belong to the tachometer beside it is read-only, with the reason recorded on the device and the adapter. - The exit path reports what it achieved, not what it attempted.
release_control()returned a count of writes it had tried, and shutdown recorded that as "handed back to firmware" — an accepted-but-unreadable write was therefore reported as a release. The result now separates confirmed / unconfirmed / refused / failed / simulated, audits each one, and separates "the adapter handed control back" from "it never does":AdapterCapabilities::hands_back_control_on_shutdownexists because the trait'sshutdowndefaults toOk(()). NVML does not implement a hand-back, so its channels are reported as not handed back instead of being claimed as released. - Every writable duty channel is released on exit. The target list was
Fan | Pump, so a GPU fan under the runtime's control kept its last duty while the audit said everything had been handed back. It now covers every device with a writable duty control.
Linux monitoring preview
- Chassis fan tachometers are read from the kernel's
hwmonsubsystem (fan<N>_input), with the current duty (pwm<N>) and who owns the channel (pwm<N>_enable) reported beside them. Read-only, deliberately: writingpwm<N>needs root, and whichpwmmaps to which physical header depends on the board and driver — a wrong value there is the classic "fans stop" failure. Control over a confirmed channel is separate work. - Channel identity is the chip name and channel number (
fan.system.nct6798d_fan1), so a kernel that renumbershwmon*cannot move a saved rule's target. A missing file, non-numeric content, a chip withoutname, a vanished channel and an unrecognised control mode each carry a reason rather than a zero. - Memory usage and total join as
memory.system.0(bytes). docs/linux-install.mddocuments download, checksum verification, extraction and running the CLI, and names what each reading's source is.
Release pipeline
-
New
scripts/release/package-linux.shand alinuxjob in the release workflow: build, workspace tests, Clippy, frontend tests, two fixture suites, packaging, then the packaged CLI is executed and its version checked. The packager refuses anything that is not a 64-bit x86_64 ELF, refuses to overwrite an existing delivery, writes its checksum list with LF, and verifies before delivering. -
The Linux checksum list is published as
SHA256SUMS-linux-x86_64: a Release holds one asset per name andSHA256SUMSis the Windows list. It names only files that are published beside it (the archive andrelease-linux-x86_64.json), sosha256sum -c SHA256SUMS-linux-x86_64in the download directory is a complete check of the download — no line picking.LICENSEand the dependency notices travel inside the archive. -
A dependency advisory (RUSTSEC-2026-0285,
rustlsviaureq) is fixed by the patch release 0.23.45, because CI's dependency audit would otherwise have been red on the released tree.
Two defects the release build found, by being slower than a developer machine -
The duty field no longer loses what you typed. It followed the device's reported value on every change, and the first reading always arrives a moment after the window opens: typing 80 % and having a reading land put the device's own 45 % back in the box, and Apply then wrote 45 % — the value the device was already at — with nothing on screen to say the request had been discarded. The field follows the device only until you touch it, says "your change is not applied yet" while an edit is outstanding, and follows the device again after a confirmed write. An unconfirmed write keeps your request visible next to a value that is still unknown.
-
A slow disk is no longer reported as a missing sensor. The automation engine asked "are my readings too old?" after doing the tick's own file writes, inside a window of three poll intervals (300 ms). On a machine whose filesystem is slower than that — a CI runner scanning every new file — rules silently dropped to the fail-safe duty and the reason said a sensor was missing while it was reporting perfectly well. The question is now asked before the tick does any work of its own, so the window detects the runtime falling behind, which is what it is for; and when readings really have stopped arriving the message says exactly that ("the runtime has not refreshed … recently, so its readings are too old to act on") instead of blaming a sensor.
Install
The Windows desktop installer and the optional PowerShell script are unsigned. LibreHardwareMonitor is a separate prerequisite for supported motherboard channels and is not bundled.
Scope of validation
Software and installation validation do not establish compatibility with a physical fan or water pump. No fan or pump has ever responded to a write from this code, and the version catalogue records hardware_validation: not_verified for every release. On Linux, whether fan tachometers exist at all depends on the board's driver (nct6798d, it87, …); the adapter reads what the kernel exposes and explains what it does not.
Verification evidence
- CI: all eight jobs on this commit.
- Windows release assets: CLI and NSIS build, both fixture suites, packaging, and the packaged CLI installed and run in isolation.
- Linux release assets: CLI built on ubuntu-latest, fixture suites, packaging, and the packaged CLI executed with its version checked.
- Version-management regression tests: 30 passed, including catalogue validation, rollback and CRLF checkouts.