Skip to content

Release v1.1.0#8

Merged
BitHighlander merged 15 commits intomasterfrom
release/1.1.0
Mar 3, 2026
Merged

Release v1.1.0#8
BitHighlander merged 15 commits intomasterfrom
release/1.1.0

Conversation

@BitHighlander
Copy link
Collaborator

Summary

  • Windows platform support (drag/resize, native modules, installer)
  • Fix WKWebView keyboard input (revert titleBarStyle hidden)
  • i18n translation system (10 languages)
  • EVM multi-address support
  • Custom EVM chain & token support
  • Firmware management improvements (custom flash, manifest)
  • Setup wizard UX overhaul (state-machine gated, compact layouts)
  • PIN/passphrase/recovery hardening
  • Cross-platform window drag/resize
  • Wipe from lockscreen
  • KeepKey SDK package

Test plan

  • macOS: verify form inputs work (device label, send form, etc.)
  • macOS: verify window drag/resize with native titlebar
  • macOS: verify setup wizard flow (fresh device)
  • macOS: verify firmware update flow
  • Windows: build and test basic functionality
  • PIN entry, passphrase, cipher recovery all work
  • EVM multi-address derivation
  • Custom chain/token addition
  • REST API endpoints respond correctly

🤖 Generated with Claude Code

BitHighlander and others added 15 commits March 2, 2026 16:52
…nditional UI

- Fix false needsBootloaderUpdate when device already in bootloader mode
  (extractVersion returns BL version as fwVersion; use it for comparison)
- Fix needsFirmwareUpdate in bootloader mode (always true, was comparing
  BL version against latest firmware)
- Show hold-and-connect SVG + instructions only when device is NOT in
  bootloader mode; auto-start update when already in bootloader
- Add pulsing "confirm on device" box and striped progress bar during
  firmware upload
- Add verify-backup-skip hints for both bootloader and firmware updates
- Add i18n keys for new UX elements

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Hide "Important" box once update starts (shown only in idle state)
- Merge "confirm on device" and "verify backup" into single pulsing box
- Remove separate red "do not unplug" box, inline it under progress bar
- Remove redundant "uploading firmware" and "device will restart" labels
- Progress bar now shows percentage left, do-not-unplug right

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Firmware flashing (firmwareErase + firmwareUpload) requires the device
to be in bootloader mode. Previously the wizard blindly called
startFirmwareUpdate() which failed with "Not in bootloader mode".

Now the firmware step mirrors the bootloader step's flow:
- If device is NOT in bootloader mode: show hold-and-connect SVG +
  4-step instructions + "I'm Ready" button that polls for bootloader
- If device IS in bootloader mode: auto-start firmware update
- Event-driven detection via deviceStatus.bootloaderMode push

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…nect

- Shrink hold-and-connect SVG to 140px with reduced opacity
- Remove "I'm Ready" button — auto-start bootloader polling on step entry
- Keep wizard open during disconnect when on bootloader/firmware steps
  (setupInProgress flag prevents phase flip to splash)
- Compact instruction text (smaller font, tighter spacing)
- Skip button demoted to subtle ghost link

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- RPC: timeoutMs=0 means no timeout (was 600s), used for all
  device-interactive ops (firmware flash, seed verify, PIN, wipe)
- Electrobun RPC maxRequestTime set to Infinity
- Setup wizard: collapsible seed length selector on create card,
  prominent selector on recovery card, remove top-level word count bar
- Remove cursor:pointer from non-clickable create card container

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The wizard overlay now acts as a drag surface so the window can be moved
during onboarding. The card itself uses stopPropagation to keep buttons
interactive. All steps are significantly more compact: smaller icons,
tighter padding, reduced font sizes, and a maxH constraint with overflow
scroll so the wizard fits cleanly within any window size.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When setupInProgress is true, the phase stays "setup" regardless of
device state. Previously only "disconnected" was covered, so transient
states like "connected_unpaired" during firmware update bootloader
reboot would kick the user back to the splash screen.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Inset drag backdrop 6px from edges so native resize handles remain
clickable while still allowing window move from the backdrop area.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Electrobun's native startWindowMove and resize are broken on Windows
WS_POPUP windows. This adds custom JS-driven drag and resize for Windows
while keeping macOS unchanged (platform-gated via IS_WINDOWS).

- useWindowDrag hook: mousedown → getFrame → track deltas → setFrame
- WindowResizeHandles: 8 invisible edge/corner handles with min 600x400
- rpcFire: fire-and-forget RPC for smooth drag/resize during mousemove
- SplashScreen dragProps: drag works on all app phases (splash, claimed, ready)
- installer.iss: always install WebView2 (fixes silent launch failure)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ogic

After bootloader/firmware flash, the wizard no longer uses a stale 5s timer
to advance. Instead it enters a rebootPhase and waits for the device to
reconnect with fresh features (firmwareVersion defined) before routing to
the correct next step. All firmware update errors are suppressed from the
UI (console-only) since USB disconnect errors are expected post-flash.
Do-not-unplug warning changed from red to yellow.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…N loop

After a firmware/bootloader flash the device reboots and the transport
needs time to stabilise. Previously promptPin() fired immediately on
needs_pin state, causing getPublicKeys to race with the freshly-booted
device — the device responded with Failure(7) "Invalid PIN" before the
user could enter their PIN, triggering a disconnect/reconnect loop.

Now when updatePhase is 'rebooting', promptPin() is delayed 2s and
updatePhase is reset to 'idle' so the wizard advancement effect sees
fresh state.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…loop

After firmware flash or USB detach, the keyring still tracked the old
wallet connection. When pairRawDevice was called on reconnect, WebUSB
rejected with "cannot connect an already-connected connection", causing
an infinite retry loop.

Added clearWallet() helper that nulls wallet/transport/features AND
calls keyring.removeAll() so the next pair starts fresh. Used in all
teardown paths: USB detach, lost connection, failed features, and all
three flash completion sites (bootloader, firmware, custom firmware).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Electrobun's drag system uses a document-level mousedown listener that
checks e.target.closest(".electrobun-webkit-app-region-drag"). The
wizard's full-viewport drag backdrop was intercepting clicks on inputs
because React's synthetic stopPropagation doesn't prevent native events
from reaching the document listener.

- Remove drag backdrop from OobSetupWizard entirely
- Add SplashNav component (drag-enabled nav bar + traffic lights) for
  splash/setup/claimed phases
- Replace floating windowControls overlay with SplashNav
- Ready phase uses TopNav (already has drag region)
- All form inputs, buttons, copy/paste now work normally

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ebView

titleBarStyle: "hidden" (Titled: false + FullSizeContentView: true) breaks
keyboard focus on form inputs in Electrobun's WKWebView on macOS. Reverted
to default titlebar which restores all form input, resize, and drag.

- Remove titleBarStyle: "hidden" from BrowserWindow config
- Remove custom TrafficLights component (native macOS controls suffice)
- Strip drag class/stopPropagation from TopNav (no longer needed)
- Change ready-phase bg from transparent to kk.bg (solid #000000)
- Add -webkit-app-region: no-drag CSS on interactive elements
- Add PIN wipe-from-lockscreen with confirmation dialog (10 langs)
- Cancel pending PIN request before wipe to prevent transport deadlock

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@BitHighlander BitHighlander merged commit 9a545dc into master Mar 3, 2026
1 of 2 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