Skip to content

Release v1.0.5#7

Merged
BitHighlander merged 18 commits intomasterfrom
release/1.0.5
Mar 2, 2026
Merged

Release v1.0.5#7
BitHighlander merged 18 commits intomasterfrom
release/1.0.5

Conversation

@BitHighlander
Copy link
Collaborator

Summary

  • Windows platform support: full Win32 build pipeline, click passthrough fix, window icon via user32.dll, Inno Setup installer
  • macOS UX fixes: hidden titlebar, custom traffic lights, always-visible window controls, auto-update toast
  • New features: Solana chain support, i18n translation system (10 languages), EVM multi-address, custom EVM chains, firmware drop-zone, EIP-712 decoder, EVM address selector
  • Build improvements: platform-aware prebuild stripping, file: linked package resolution, version-aware nested dep dedup (fixes v1.0.0 crash)
  • REST API: expanded endpoints, Pioneer portfolio integration, paired apps panel, WalletConnect panel
  • Docs: architecture guide, coin addition guide, firmware docs, LLMs.txt
  • keepkey-sdk: new TypeScript SDK package for REST API consumers

Test plan

  • macOS DMG install + launch
  • Windows installer + launch
  • Device connect / disconnect cycle
  • PIN entry, passphrase entry, cipher recovery
  • BTC, ETH, Cosmos, Thorchain, Solana address derivation
  • Send flow (BTC + ETH minimum)
  • Firmware update flow
  • i18n language switching
  • Custom EVM chain addition
  • REST API health check on port 1646

🤖 Generated with Claude Code

BitHighlander and others added 18 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>
The windowControls overlay (z-index 1001) spanned full width with
electrobun-webkit-app-region-drag, sitting on top of TopNav (z-index 1000)
and blocking all clicks on tabs, settings, and other interactive elements.

Electrobun's drag detection has no "no-drag" exclusion for buttons, so
every mousedown inside the drag class triggered startWindowMove, which on
Windows uses aggressive raw input tracking that swallows click events.

Fixes:
- Remove full-width drag overlay from windowControls (only traffic lights)
- Add onMouseDown stopPropagation on TopNav interactive elements to prevent
  Electrobun's document-level drag handler from intercepting clicks
- Bump version to 1.0.5

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