Skip to content

feat(ui): session-wide UI/UX polish + reachability fix#10

Open
Sentinel-Bluebuilder wants to merge 8 commits intosentinel-official:mainfrom
Sentinel-Bluebuilder:feat/ui-overhaul
Open

feat(ui): session-wide UI/UX polish + reachability fix#10
Sentinel-Bluebuilder wants to merge 8 commits intosentinel-official:mainfrom
Sentinel-Bluebuilder:feat/ui-overhaul

Conversation

@Sentinel-Bluebuilder
Copy link
Copy Markdown
Contributor

Summary

  • NodeDetails IdentityDisclosure rewrite — compact 4-col grid, canonical PanelLabel/PanelSection/KV/Mono/CopyMono primitives, theme-tokenised type scale, QR tile, and condensed Snapshot/Memo preview text. SpecsReportingPanel converted to the same primitives.
  • Container-logs scroll fixitems-start on the NodeDetails grid prevents the log card from being stretched to row height and clipped by card { overflow: hidden }.
  • Stuck-Syncing reliability fix — wrap containerLogs() inside recentLogs() in try/catch (src/main/services/node-manager.ts). With Docker Desktop down, getClient() was throwing through liveStatus, masking the real containerUp/onChain reachability check, which made the Nodes-list chip stick on yellow "Syncing" while the NodeDetails header chip stayed green "Online" (sticky node.status). The remote-SSH branch already wraps its log fetch the same way; this brings the local branch in line.
  • RPC pool health — Settings refreshes the chain RPC pool every 60s.
  • Misc UI passes — Topbar back-button removal, Layout route-keyed transitions, OnChainSpecs specs:v1 chip removed + Snapshot card 3.3% taller, polish across ManageDocker / Activity / CLI / Help / Overview / Progress / System / Wallet / WalletSetup / DeploySshBatch.
  • Add .nvmrc; README + package.json housekeeping.

Test plan

  • Open Nodes list and a node's Details page side-by-side; chip status agrees in both views (no Online/Syncing mismatch).
  • Stop Docker Desktop with a previously-Online node — list chip flips to a meaningful state without spamming Error: Docker Desktop is installed but not running from liveStatus every poll.
  • NodeDetails container logs: scroll reaches the last line, no clipping.
  • IdentityDisclosure expand/collapse: spacing and typography match the rest of the theme.
  • Settings: RPC pool entry timestamps tick at ~60s cadence.

Sweeping changes from the long-running feat/ui-overhaul branch:

- Renderer redesign across every screen (Overview, Nodes, NodeDetails,
  Wallet, WalletSetup, Settings, Help, Progress, Layout/Sidebar/Topbar,
  PageHeader, StatCard, BarChart, Onboarding) with new shared theme,
  country flags, error boundary, and CLI helper lib.
- New deploy flows split out of the old monolithic Deploy.tsx into
  DeployLocal, DeploySsh, and DeploySshBatch (batch screen ships hosts
  table, shared creds/params, parallel test, sequential chain broadcast,
  per-row progress, and an Automate-via-CLI panel that links to the CLI
  screen).
- Manage Docker screen with skeleton-first rendering, Docker Desktop
  detection/launch, Sentinel containers + images cards, conditional
  Actions card.
- CLI subsystem: in-app CLI server (named pipe, JSON line protocol),
  command registry, bin/sentinel-node-manager.js client, and a CLI
  screen with poll-spam toggle for clean recordings.
- Main services added: tray, geoip, price, cli-server, cli-registry.
- Wallet, deploy, nodes, settings, store, updater services updated for
  the new IPC surface; preload + shared types rewritten to match.
- Tray icons, app icon set, brand assets, fonts.
- Unit test scaffolding (tests/unit/price.test.ts).

Tooling: ignore *.tsbuildinfo, build-ctx/, design-exports/. Drop
committed tsbuildinfo files. Update package.json/lock for new deps.
… harness

This is a large changeset spanning the on-chain hardware-specs reporting
pipeline, a live System metrics dashboard, defence-in-depth security
posture, a real-money end-to-end CLI test harness, and broad UI polish.
See CHANGELOG.md for the full per-area breakdown.

Highlights:

* On-chain `specs:v1` — operator self-MsgSend with a tagged memo carrying
  the node's hardware snapshot, fired automatically 12 s after deploy
  succeeds (gas budget 250_000; the previous 120_000 hit code 11
  out-of-gas through Sentinel ante handlers). Startup `replayPendingSpecs`
  retries any unsent broadcasts from the previous session.
* Live System metrics — refcounted 1 Hz CPU/memory sampler, broadcast
  over IPC, surfaced in a new System screen. Toggles live in the Zustand
  store so they survive navigation; default ON.
* Activity feed — grouped, filterable event log replacing the ad-hoc
  toast history.
* Seed-phrase modal — global, mounted at Layout level so it survives
  tab switches; verify-3-words confirmation; never re-opens for the
  same jobId.
* Security hardening — renderer sandbox enabled, strict CSP, window-open
  + will-navigate guards, CLI auto-start now gated behind an explicit
  ack token, TOFU SSH host-key tracking, scrubSecrets on CLI broadcast
  events, mnemonicForBackup redacted from `deploy.status` over the CLI.
* Live-applied settings — wallet + node poll cadences swap immediately
  on save instead of needing an app restart.
* SSH batch deploy rewrite — CSV/JSON input, parallel-with-cap scheduler,
  per-row credential override, gated mnemonic reveal per host.
* Docker integration — Windows pipe detection prefers
  dockerDesktopLinuxEngine, structured `dockerHealth()`, in-app open of
  Docker Desktop settings.
* Wallet/sentinel-client — RPC-first per global rule, signClient helper,
  TRANSIENT_ERR catches the fresh-account propagation lag so post-funding
  broadcasts retry cleanly.
* End-to-end CLI test harness — tests/e2e/cli-e2e.mjs drives every CLI
  command including a real self-send and MsgUpdateNodeDetails broadcast,
  verified on-chain via Sentinel RPC tx_search. Total spend per run
  ≤ 0.0015 DVPN. Full protocol in docs/e2e-cli-test.md.
* Logger — global unhandledRejection / uncaughtException hooks, child
  loggers per area.

Untracked the previously-committed tsconfig.*.tsbuildinfo files (already
in .gitignore but were tracked from a prior commit).
…redesign

- node-manager: gate fast-poll node-online event on loading->online so
  it fires once instead of every 4s tick during the 60s grace window
- OnChainSpecs: redesign snapshot card with vendor logo (AMD pre-2013
  Wikimedia SVG), Reserved/Total meters, simplified copy
- Settings: drop the On-Chain Reporting card (post-on-chain toggles)
- Help: full redesign with searchable left-rail nav, scroll-spy,
  grouped topic sections, keyboard shortcut card
Adds an accent-tinted gradient + wallet icon badge, aligns the value
and $P2P unit to a shared baseline, and moves Withdraw below the value
with a tooltip explaining the disabled state.
rpc.sentinel.suchnode.net (sentinelhub-2, tx_index on) joins
rpc.sentinel.co + AutoStake + Polkachu in the latency-aware fallback
pool. README updated to "four endpoints".
Renderer (UI overhaul wave):
- NodeDetails: rewrite IdentityDisclosure with canonical PanelLabel/
  PanelSection/KV/Mono/CopyMono primitives — compact 4-col grid, QR
  tile, theme-tokenised type scale; convert SpecsReportingPanel to
  same primitives with optional "Awaiting broadcast" chip
- NodeDetails: fix container-logs scroll clipping (grid items-start
  prevents row sibling stretching); paddingTop/Bottom on log inner div
- OnChainSpecs: drop "specs:v1" chip from SpecsMemoCard header;
  condense Snapshot + Memo preview text ~5%; Snapshot card 3.3% taller
- Settings: refresh chain RPC pool every 60s (setInterval cleanup)
- Topbar/Layout: remove back button; route-keyed page transition
- ManageDocker, Activity, CLI, Help, Overview, Progress, System,
  Wallet, WalletSetup, DeploySshBatch: theme/spacing/copy passes

Main:
- node-manager.ts: wrap containerLogs() inside recentLogs() in
  try/catch — a stopped Docker daemon was throwing through liveStatus
  and masking the real containerUp/onChain reachability check, causing
  the Nodes-list "Syncing" chip to stick while the NodeDetails header
  stayed "Online" (see findings/2026-04-30-stuck-syncing-when-docker-down.md)
- deploy.ts, node-specs.ts: minor follow-ups from prior session

Misc:
- Add .nvmrc
- README + package.json housekeeping
CI typecheck failed with TS2322 because the ref callback on a
<section> element returns HTMLElement, but sectionRefs was typed as
Record<string, HTMLDivElement | null>. Widening to HTMLElement matches
the actual element and unblocks PR sentinel-official#10 CI.
Replaces the 4-endpoint pool (rpc.sentinel.co, AutoStake, Polkachu,
SuchNode) with the 12-endpoint list shipped by [email protected]
(defaults.js, RPC_ENDPOINTS, verified 2026-05-02 by
audit-rpc-endpoints.mjs).

The biggest correctness change is dropping rpc.sentinel.co. On
2026-05-02 it was ~22k blocks behind tip yet reporting catching_up=false,
and returning 0 for funded addresses. Keeping it in the pool meant any
balance / node-status query that happened to land on it returned wrong
data without surfacing an error.

New endpoints (all verified 2026-05-02): Busurnode, Trinity Stake,
PublicNode (Allnodes), Polkachu, MathNodes, Roomit, SuchNode,
ChainTools, Validatus, QuokkaStake, Sentinel Growth DAO, ChainVibes.

URLs intentionally have no explicit :443 — matches SDK form and
isValidRpcUrl in settings.ts only checks protocol, so omitting the
port is fine.
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