igneum/docs/plans/miner-ui-4.md
igneum-labs fc94277775 miner-ui-4: Overview (the C hero, the chain live, the node line) and Cards (every row with Ember as its second layer)
Rail: Overview, Cards, Earnings, Prove, Settings. Overview: the fleet rate at 84 px on the fade with W, £ a day and
blocks, Start/Stop as the bar under it, the site's live-dag.js on the engine's api/live with this machine's lane as
'you' (the app's blocks strip as the fallback until the engine serves api/live), the node line, the activity feed.
Cards: the Tuning strip (goal with its £ a day, the fleet saving in W and £, Tune all, the schedule, Power control
when off), the rows with a flame mark that fills with the tune's progress, before -> after watts, a sparkline of the
ladder, 'Tuned 2 h ago · 2470 MHz at 80% · next check Sunday · saves 84 W, 0.16% of rate', Retune, and under the
chevron the cap, the card's own goal, the curve with the chosen point ringed. Reads Ember's tune_before_watts,
tune_before_mhs, tune_goal, sweep_watts, sweep_mhs, tune_curve. Rust: one route, GET /live-dag.js. The ui-mock gains
/api/live. 37 UI tests pass.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 18:48:26 +00:00

5 KiB

Igneum Miner UI 4: Overview, Cards, Ember on the row

6 October 2026, evening. the project lead: "add Cards under its own tab, and have Overview and the cool mining demo on the main page with the revamped C option", then "incorporate Ember into the Cards tab beautifully", then "I would like the new miner UI to go into .15". Branch miner-ui-4 from the 0.3.15 tip 6ea9497 (untouched), worktree ../igneum-wt-miner-ui-4. Rust: one route (GET /live-dag.js, server.rs), nothing else.

1. The rail

Overview, Cards, Earnings, Prove, Settings; Logs and Quit in the foot; a bottom tab bar under 720 px.

2. Overview

Block What
The hero (the project lead's pick, C) the fleet rate at 84 px on a graphite-to-obsidian fade, W with MH/W, £ a day at the user's price, blocks (this run, lifetime) beside it; Start/Stop as the full-width bar under it with its state sentence at the right
The chain, live the site's live-dag.js (a byte copy at app/igneum-app/ui/live-dag.js, served by the engine at /live-dag.js), mounted on the engine's own api/live with mine: 'you' so this machine's lane reads "you" and its blocks take a molten ring; the legend words in HTML under the canvas: yours, pending, included, excluded, proven, locked; Pause; a tooltip per block. The engine's /api/live is OWED (it maps the local node's RPC into the site's reply shape: {ok, state, blocks[{hash, ts, blue_score, daa, parents, chain, color, miner, locked, final, shards, proven}], finality.checkpoints}); until it exists the module reports failed and the app's own 10-minute blocks strip draws in its place with the note "The full chain view needs the next engine update".
The node line as 0.3.15, Details under it
Activity the event feed in the app's voice (the strip canvas moved into the chain card as the fallback)

3. Cards

Block What
The Tuning strip the goal control (Efficiency, Balanced, Maximum) with "about £X a day at Y W"; the fleet saving ("Ember saves 84 W, £0.56 a day over 1 tuned card", View.fleetSaving); Tune all; the schedule line; Power control only when an NVIDIA card has it off
The rows as 0.3.15 (state word with its reason, MH/s, W with MH/W, £ a day, °C, the switch, the chevron) with Ember as the second layer
The flame mark the brand mark's two polygons, 16 px, outline when not tuned, filling bottom-up with step k of n while tuning (molten), solid ember when tuned, half grey when measured only
The Ember line "Tuned 2 h ago · 2470 MHz at 80% · next check Sunday · saves 84 W, 0.16% of rate"; "Tuning: step 4 of 9 · about 7 min left" with the bar; "Measured, not tuned · Power control is off"; "Not tuned yet · starts after 2 min of steady mining"; the fleet pause and a stop in the same place
The W cell before → after when tuned (tune_before_watts → the live draw)
The MH/W cell a 44 px sparkline of the ladder's MH/W per step, the chosen step as a dot
Tune / Retune / Stop the row's button; Retune once tuned
The chevron the cap slider, the applied or Retry line, memory and clocks, the card's own goal (As the fleet, Efficiency, Balanced, Maximum: POST api/tune/goal {key, goal}, "" clears; a build without it gets a toast), Retune, the Tuned line, the curve (W across, MH/s up, every step a dot, the chosen ringed, a rejected one hollow), identities, the facts

Fields read (Ember Tune 5429e82, on the 0.3.16 lane): tune_before_watts, tune_before_mhs (step 0 of the last full plan; 0 = never; the UI falls back to tune_curve[0] only for a full plan on an older build and claims no saving for a confirm or baseline plan), sweep_watts, sweep_mhs, sweep_eff, tune_curve, tune_goal, tune_step, tune_steps, tune_eta_s, sweep_state, sweep_note, tune_floor (asked for). View.ember and View.beforeOf carry the rules; view.test.mjs covers every state.

4. Screenshots (the mock on port 4318 with the rig state, the 5090 tuned, the 4070 at step 4 of 9)

docs/plans/miner-ui-4/u01-overview-dark-1440.png, u02-overview-light-1440.png, u03-cards-dark-1440.png (the 5090's details open: cap, goal, Retune, the curve), u04-cards-light-1440.png, u05-overview-dark-390.png, u06-cards-dark-390.png, u07-overview-light-390.png, u08-cards-light-390.png, u09-overview-mac-dark.png. The chain scene in the shots is the mock's /api/live (four lanes, one block a second, "you" ringed); on a real 0.3.15 engine the fallback strip shows until /api/live lands.

5. Owed

What Who
GET /api/live on the engine: the local node's blocks over the window, mapped into the site's shape, this machine's vote keys as the lane "you" engine
card.tune_floor Ember (said yes)
watts_total, pounds_per_day for the tray tip; address.balance_wei; price_gbp_per_ign engine (from miner-ui-3)
Re-copy site/live-dag.js over app/igneum-app/ui/live-dag.js when the site agent's audit commit lands, so the two stay identical the shipper at merge

Tests: node --test app/igneum-app/ui/*.test.mjs: 37 pass.