Skip to content

Release v1.0.4#6

Closed
BitHighlander wants to merge 17 commits intomasterfrom
release/1.0.4
Closed

Release v1.0.4#6
BitHighlander wants to merge 17 commits intomasterfrom
release/1.0.4

Conversation

@BitHighlander
Copy link
Collaborator

Summary

  • Update banner on all screens: Shows on splash, setup wizard, claimed, and ready phases instead of only after full load
  • Human-readable update text: Uses translation keys instead of raw Electrobun build hashes
  • Windows platform support: Platform-aware prebuild stripping, file: link resolution, Win32 window icon, PowerShell dev script
  • Firmware fixes: BL hash-to-version fallback (prevents update loops), KPKY header stripping for integrity check, 10s manifest fetch timeout
  • Faster device detection: USB listeners register before manifest fetch to avoid missing attach events
  • Custom window controls: Hidden titlebar with class-based drag regions, traffic lights on all screens
  • Stability hardening: Global error handlers, RPC reconnection cap, debounced updater
  • Solana support: Firmware binary tracked, signMessage added
  • Dashboard improvements: Cached portfolio display, lazy loading, GetPortfolio charts endpoint
  • Dead code removal: Binance Beacon Chain SDK purged (~27MB savings)

Test plan

  • macOS: Verify DMG installs and launches correctly
  • macOS: Verify auto-update from v1.0.3 works
  • macOS: Verify window drag, close/minimize/maximize buttons
  • macOS: Verify update banner appears on splash screen
  • Windows: Verify platform-aware build produces correct prebuilds
  • Firmware: Verify no false bootloader update loop on devices without BL version

🤖 Generated with Claude Code

BitHighlander and others added 16 commits February 26, 2026 16:19
Replace `submodules: recursive` with selective init of hdwallet and
proto-tx-builder only. The recursive checkout fails because
keepkey-firmware has deeply nested submodules (lwip.git) that cannot
be cloned from git.savannah.gnu.org in CI.

Also update hdwallet submodule pointer to develop branch with Solana
support (keepkey/hdwallet#15).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The AppImage is already created in the artifacts directory (cwd),
so `mv file .` fails with "are the same file".

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

- BUILD.md: added signing deep dive (3 passes, entitlements, Mach-O detection),
  prune-app-bundle stage, version-aware dedup, DEV_BLOCKLIST, corrected bundle size
- API.md: complete rewrite documenting actual RPC methods (70+) and REST endpoints (~60)
- ARCHITECTURE.md: fixed stale references (React Router → tab state machine, updated
  file tables, lodash/rxjs cleanup marked complete)
- ELECTROBUN.md: fixed build targets, added collect-externals to pipeline, entitlements section
- collect-externals-guide.md: updated to 9-step pipeline with DEV_BLOCKLIST and banned packages
- README.md: removed keepkey-desktop references, documented direct USB architecture

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove unsigned/*.bin from .gitignore (unsigned builds should be tracked)
- Add firmware.keepkey.solana-8acfd898.bin (523KB, Ed25519 support)
- Add payload hash to firmware_hashes for analyzeFirmware() detection
- Add unsigned_firmware section to manifest with full + payload hashes

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

Root cause: vault called GetPortfolioBalances (/portfolio) which only returns
native balances. Pioneer SDK uses GetPortfolio (/charts/portfolio) which returns
both balances AND tokens arrays. Switched to the correct endpoint.

Dashboard changes:
- No auto-fetch on mount — loads from SQLite cache only (saves API credits)
- Small highlighted refresh button below chart with pulse animation when stale
- Removed bulky stale-balance header banner
- Token warning when refresh returns zero tokens
- getCachedBalances now returns updatedAt timestamp for "last updated" display

Also includes: SDK updates, EIP-712 decoder, signing approval improvements,
SendForm enhancements, REST API refinements, API audit log improvements.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…rove dashboard cache display

- hdwallet: fix stale version pins pulling bnb-javascript-sdk-nobroadcast
  (~27MB) from npm registry; regenerate yarn.lock; add Solana signMessage
  protobuf shims + wallet method
- collect-externals: add bnb-javascript-sdk-nobroadcast to DEV_BLOCKLIST
- Dashboard: color-coded cache age (green <1h, yellow <24h, red >24h)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix baseUrl: BitHighlander/keepkey-vault-v11 → keepkey/keepkey-vault
  (root cause of "Update check failed, will retry")
- Warning/error notifications now render as small bottom-right toast
  instead of full-width top banner
- Auto-dismiss after 20 seconds
- Actionable phases (available, downloading, ready) keep full top banner

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Use titleBarStyle: "hidden" to remove native titlebar that caused
  ~150px blank gap between chrome and WebView content
- TopNav now serves as draggable window handle with traffic light padding
- Add global error handlers (uncaughtException/unhandledRejection) in Bun
- Add frontend unhandledrejection handler to prevent silent failures
- Cap RPC WebSocket reconnection at 50 attempts (was infinite)
- Debounce Updater.onStatusChange to prevent RPC spam on errors
- Fix misleading "will retry" text in update error toast
- Fix hdwallet transport ArrayBuffer casts for strict TS

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

- titleBarStyle: "hidden" eliminates blank gap (hiddenInset broken in Electrobun)
- Custom close/minimize/maximize dots in TopNav right side
- Window control RPC handlers (windowClose/Minimize/Maximize)
- Electrobun-compatible inline style drag regions (app-region: drag)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Reorder traffic lights: green → yellow → red (close/X rightmost)
- TrafficLights rendered on ALL phases (splash, claimed, setup, ready)
- className="electrobun-webkit-app-region-drag" for reliable window dragging
- Bump version to 1.0.3

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
REMOVE_PREBUILD_PREFIXES was hardcoded to strip linux/win32/android,
which is correct for macOS builds but strips Windows native modules
(node-hid, usb, keccak, secp256k1) when building on Windows or Linux.

Make the prefixes dynamic based on process.platform so each platform
keeps its own prebuilds and only strips the others.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Build infrastructure:
- Add build-windows-production.ps1 (EV code signing, Inno Setup installer)
- Add installer.iss with WebView2 bootstrapper for Win10 support
- Add wrapper-launcher.zig for branded EXE with embedded icon
- Add dev-hmr-windows.ps1 for Windows HMR development
- Embed KeepKey icon into wrapper + launcher via rcedit (skip bun.exe)

Window icon fix:
- Call setWindowIcon FFI on Windows via libNativeWrapper.dll
- Electrobun doesn't invoke this on Windows, causing Bun logo in taskbar

Engine reliability fixes (affect all platforms):
- Register USB attach/detach listeners BEFORE manifest fetch to prevent
  lost device events during network calls
- Add 10s AbortSignal timeout to firmware manifest fetch
- Use initialize() instead of getFeatures() for bootloader-mode compat
- Add bootloader hash-to-version lookup to prevent update loop when
  blVersion is missing but hash proves firmware is current
- Strip 256-byte KPKY header before hashing firmware binary for
  manifest integrity verification

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- collect-externals.ts: Resolve file: linked @keepkey/* packages to
  their actual source directories. Bun leaves empty stubs in
  node_modules for file: deps, causing 0 transitive deps to be
  collected (79 → 238 packages now properly found).
- index.ts: Replace Electrobun's setWindowIcon (no-op on Windows)
  with direct Win32 API calls via bun:ffi — LoadImageW + SendMessageW
  WM_SETICON on the HWND from mainWindow.ptr.
- build-windows-production.ps1: Copy real ICO over renamed-PNG app.ico
  so LoadImageW can load it at runtime.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Show update banner on splash, setup, claimed, and ready phases
- Remove duplicate inline UpdateBanner from ready phase
- Use translation key instead of raw Electrobun build hashes
- Bump version to 1.0.4

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

Updater.applyUpdate() extracts the new version, replaces the app bundle,
spawns a relaunch shell, then calls quit(). The quit() kills the Bun
process before the RPC response can be sent, so the frontend always saw
a timeout error.

Fix: make applyUpdate fire-and-forget on the Bun side (return immediately,
let status messages drive UI). Frontend ignores RPC errors during apply
since connection loss is expected when the app restarts.

Also add missing Electrobun status mappings: 'applying', 'extracting',
'launching-new-version', 'complete' → all map to 'applying' phase.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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