Skip to content

release: v1.4.3 — Windows fixes, USB troubleshooter, clearHalt fix, swaps always-on#232

Merged
BitHighlander merged 10 commits into
masterfrom
release/1.4.3
Jun 7, 2026
Merged

release: v1.4.3 — Windows fixes, USB troubleshooter, clearHalt fix, swaps always-on#232
BitHighlander merged 10 commits into
masterfrom
release/1.4.3

Conversation

@BitHighlander

Copy link
Copy Markdown
Collaborator

release: v1.4.3

Brings master in line with the published release: https://github.com/keepkey/keepkey-vault/releases/tag/v1.4.3 (prerelease).

Merged back to develop in 541c6ec8 (Merge branch 'release/1.4.3' into develop).

Included since 1.4.2

Windows

USB transport

App

Verification

  • Pre-flight: signing gate (KEY HODLERS LLC), submodule tiers clean (hdwallet on master @ c5a4d79b), build-pipeline gates green
  • CI green on release/1.4.3 (Linux + macOS)
  • arm64 + x86_64 DMGs built, notarized (Accepted) and stapled; Gatekeeper "accepted / Notarized Developer ID"
  • backend smoke test booted clean (no missing externals)
  • signed x64 tar.zst hash verified on-wire; SHA256SUMS.txt regenerated from on-wire bytes

Windows win-x64-setup.exe is added separately by the Windows build box.

BitHighlander and others added 10 commits June 7, 2026 01:31
v1.4.2 published as prerelease.
…sh (#226)

Two fixes for building the Windows release from a clean machine:

1. build-windows-production.ps1 prepends %ProgramFiles%\Git\usr\bin to PATH so
   the electrobun bootstrap's "tar --force-local -xzf" resolves to GNU tar
   instead of System32 bsdtar. The --force-local flag is added on Windows by
   patch-electrobun.sh so tar does not treat the "C:" in the cache path as a
   remote host; bsdtar rejects that flag ("Option --force-local is not
   supported") and aborts the build. The dir contains no link.exe/cl.exe, so
   MSVC native builds (usb, node-hid, cargo C deps) are unaffected.

2. .gitattributes marks *.sh as eol=lf. With core.autocrlf=true (common on
   Windows clones) and no rule, shell scripts arrived as CRLF, which breaks bash
   parsing and fails the Windows preflight check (scripts/preflight-windows.ps1).
#228)

* fix(windows): force per-user install so the app launches without admin

The bundled Bun runtime opens its own program files with a write-class
right (FILE_WRITE_ATTRIBUTES) even for read-only reads. On the standard
read-only Program Files ACL (Users:(RX)), a normal non-elevated
(medium-integrity) process is denied that right, so bun fails with
"EPERM reading ...\Resources\main.js", the backend Worker never starts,
and the app hangs on the splash forever. An elevated/admin token has
full control over the files, so it only reproduces for a NON-elevated
launch of an "all users" (Program Files) install -- which is why it looked
like a Win10-vs-Win11 or 1.4.0-vs-1.4.2 issue when it was really an
install-location issue (per-user LOCALAPPDATA works; Program Files breaks).

installer.iss used DefaultDirName={autopf} + PrivilegesRequiredOverrides
Allowed=dialog, so choosing "Install for all users" (or running setup as
administrator) placed the app in read-only Program Files and broke every
normal double-click. Force a per-user install instead:

- DefaultDirName -> {localappdata}\Programs\KeepKeyVault (user-writable, so
  bun's FILE_WRITE_ATTRIBUTES open succeeds at medium integrity)
- remove PrivilegesRequiredOverridesAllowed (no "all users" option; setup
  never requests elevation)
- [Code] guard: reject a Program Files install target and warn about a
  pre-existing system-wide install that needs removing

Verified on Windows 11: the same app bundle launches via a normal
double-click (medium integrity) from %LOCALAPPDATA%\Programs\KeepKeyVault,
while the identical files under C:\Program Files fail with EPERM. ISCC
compiles the updated script cleanly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(windows): suppress installer prompts on /SILENT so unattended installs don't hang

WizardSilent guards on InitializeSetup + NextButtonClick MsgBox -- /SUPPRESSMSGBOXES
does not suppress [Code] MsgBox. A Program Files target is still rejected silently.

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Swaps are now on for everyone, always. Removes the swapsEnabled
opt-in flag end to end:

- Backend: drop the swapsEnabled var, its persisted setting, the
  setSwapsEnabled RPC, and the !swapsEnabled gates on every swap
  handler (deviceSwapAssets, getSwappableChainIds, searchSwapAssets,
  lookupTokenContract, getSwapQuote, executeSwap, getPendingSwaps,
  previewSwapBuild). Swap tracker now always initializes on boot.
- Shared types/RPC schema: drop swapsEnabled from AppSettings and the
  setSwapsEnabled request.
- Frontend: remove the Settings toggle + handler, and the swapsEnabled
  gating in App and AssetPage. The Swap action still shows only for
  chains Pioneer reports as swappable.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
)

Adds a read-only USB diagnostic the user can run from the 'Searching for
KeepKey' splash on Windows when a connected device isn't detected (WinUSB not
bound). It classifies the likely cause (timing race / poisoned osvc cache /
conflicting driver / not-present) and produces a copy-ready report plus a link
to support.keepkey.com.

- src/bun/windows-usb-probe.ts: read-only PowerShell (Get-PnpDevice presence,
  bound service, osvc UsbFlags cache) + libusb visibility; never throws;
  collects no wallet data, serials, labels, xpubs, or addresses.
- runUsbDiagnostic RPC + handler (win32-gated inside the probe).
- WindowsUsbTroubleshooter.tsx: subtle 'Trouble connecting? Run diagnostics'
  link → results card with Copy report + Contact support (mirrors LinuxUdevWarning).
- Shown only on Windows when state==='disconnected'.

v1 = copy-to-clipboard + support link; deeper support-ticket integration is a
follow-up. The dead-backend pre-load message is tracked separately.
…udit & fix plans (#227)

* docs(windows): add Windows USB connection audit + app/firmware fix plans

Planning docs for the Windows "device not detected" USB reports: Windows
enumerates the device (the connection chime plays) but the app never sees
it because WinUSB is not bound, so it is invisible to libusb / the usb
package. Docs only.

- WINDOWS-USB-AUDIT.md: root-cause analysis ranking 3 causes (WinUSB
  binding timing race, poisoned MS OS 1.0 osvc cache, conflicting driver)
  with a read-only PowerShell diagnostic to confirm which dominates.
- WINDOWS-USB-FIX-PLAN.md: 10 app-side fixes, phased by ROI vs the symptom.
- WINDOWS-USB-FIRMWARE-PLAN.md: 5 firmware fixes; bcdDevice-from-version
  makes a flash self-heal poisoned machines.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(windows): re-probe USB after attach so slow WinUSB binds are detected

On Windows, WinUSB can take longer than ATTACH_DELAY_MS to bind interface
0 of the composite device (behind a hub/dock), during which the device is
invisible to libusb. The single post-attach syncState() then sees nothing,
lands in the disconnected branch with no lastError, and never re-probes
(scheduleRetry only arms on connected_unpaired + lastError) -- so the
device is never detected until the app restarts. Matches the reported
"chime plays but app doesn't detect" symptom on fresh installs / hubs/docks.

Add a bounded discovery poll (1.5s x ~18s) that re-runs syncState() after
attach and at startup-with-no-device, self-stopping on pair or after the
grace window. Mirrors the existing startRebootPoll() pattern; purely
additive (new fields + two methods + call sites, nothing removed).

See docs/WINDOWS-USB-AUDIT.md (Cause A) and docs/WINDOWS-USB-FIX-PLAN.md (FIX-1).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(windows): gate discovery poll to win32 + stop on detach; correct LONG_TIMEOUT doc

- startDiscoveryPoll() returns early off-Windows (the WinUSB binding race it works
  around does not exist on macOS/Linux; avoids ~18s redundant enumeration at startup)
- detach handler now stops the poll instead of re-probing an absent device
- WINDOWS-USB-FIX-PLAN.md FIX-3: LONG_TIMEOUT is 5 min, not ~90s

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ster) (#231)

Picks up keepkey/hdwallet master:
- #45 fix(keepkey-webusb): clearHalt the IN pipe on a stalled read, not OUT
- #46 fix(lint): make master lint-clean (zcash, hive, keepkey)

clearHalt is the only functional change (the rest is formatting); no hdwallet API
change, so no vault code change is needed. Run `make modules-build` after pulling.
The donut read small in the ~62vh chart area. Bump fills the space; hover (315px)
still fits both the all-chains (62vh) and drilled (380px) containers.
…ngR 0.46->0.322)

Applies to both the all-chains OrbitalView and the drilled ChainDetailOrbital so
the two stay consistent. Satellites stay on the dashed ring; center total is
unchanged and the tighter orbit clears it with room to spare.
@BitHighlander BitHighlander requested a review from pastaghost as a code owner June 7, 2026 23:44
@BitHighlander BitHighlander merged commit cf28d58 into master Jun 7, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant