171 lines
17 KiB
Markdown
171 lines
17 KiB
Markdown
# Igneum Miner UI 2: sections behind a rail, 5 October 2026
|
|
|
|
the project lead, 18:40 UTC: "can any updates be made to the UI of the miner? different sections for different features. Made
|
|
super simple for users, all settings super easy and simple and everything looking gorgeous, as close to shippable
|
|
as we can get right now." Worktree `/Users/joshm/Projects/igneum-wt-miner-ui`, branch `miner-ui-2` from master
|
|
a93199a. the project lead approved the redesign from the screenshots (20:1x UTC) and moved it into 0.3.10: the 0.3.10 shipper merges
|
|
`miner-ui-2` last and rebuilds the app. Times are UTC.
|
|
|
|
## 1. What changed
|
|
|
|
| Where | What |
|
|
|---|---|
|
|
| `app/igneum-app/ui/index.html` | One page became a rail with six sections: Mine, Prove, Rewards, Node, Updates, Settings. The welcome, GPU and address screens and the one-time key sheet stay as they were. The settings panel, the bottom bar and the proving tile are gone; every control they held is placed on a section. |
|
|
| `app/igneum-app/ui/app.css` | Rewritten around the rail, the thin top bar, the status strip and the pages. Same tokens as the site (obsidian, graphite, ember, molten, bone, ash; Unbounded, IBM Plex Sans, IBM Plex Mono). One accent. Lays out from 900 x 600: under 1000 px the rail folds to icons, the number strips to two columns, the two-column grid to one. Focus rings on every control (`:focus-visible`, the switch tracks). |
|
|
| `app/igneum-app/ui/app.js` | New pure block `View` (the words every section shows for a state), tested by `view.test.mjs`. The Notices and UpdateCard blocks, the log drawer and the blocks canvas are unchanged. `?page=<name>` forces a section and `?logs=1` opens the drawer (screenshots). |
|
|
| `app/igneum-app/ui/view.test.mjs` | 10 tests: the GPU row (names, kinds, integrated off, temperatures amber then red, unknown numbers blank), the big button, the node words, the next switch, the prove words, the dev-fee lines, the jobs line. Added to `.github/workflows/ci.yml`. |
|
|
| `app/igneum-app/src/state.rs`, `engine.rs` | Engine addition 1: `node.consensus_digest`, the node's own "Consensus params digest" line (`digest_from_line`, tested; a peer's digest in a WARN line is never taken). Addition 2: `node.consensus_switches`, every `*_activation_daa` in the override file the node was started with, lowest first, in plain words (`switches_of`, tested). |
|
|
| `app/igneum-app/src/prover.rs` | Engine addition 3: `proving.program_id` and `proving.aggregator_id` from `igneum-prove-host --mode id` (`ids_from_describe`, tested), read once at thread start on macOS and Linux and when the WSL2 host is found on Windows, proving on or off. |
|
|
| `app/mac/IgneumMiner.swift` | Window minimum 900 x 600 (was 900 x 620). |
|
|
| `app/windows/host.cpp` | One `WM_GETMINMAXINFO` case: minimum 900 x 600 (there was no minimum). |
|
|
|
|
The API contract is otherwise as it was: the UI calls the same routes (`api/state`, `api/cards`, `api/pause`,
|
|
`api/resume`, `api/prove`, `api/settings`, `api/update/*`, `api/jobs/*`, `api/sweep/*`, `api/key/*`, `api/log`,
|
|
`api/open`, `api/quit`, `api/clock/sync`, `api/power/apply`, `api/detect`, `api/phase`, `api/setup`, `api/start`).
|
|
|
|
## 2. The sections
|
|
|
|
| Section | What it holds | Where it was |
|
|
|---|---|---|
|
|
| Mine | One big Start mining / Stop mining button (pause and resume), hash rate, blocks found, next program; one row per GPU with its real name, kind tag (Integrated shown as such and off by default, the engine's rule), on/off switch (applies at once; the other cards keep their identities and caps), hash rate, temperature and power where the card reports them; the blocks strip; Activity | the dashboard strip, the Cards card, the Pause button, the Events card |
|
|
| Prove | The proving switch with three plain sentences on what proving is; state, assigned, proven, paid (IGN when paid); the verifier's state with one line; the shard program id and the aggregator id with Copy; Set up when the WSL2 host is missing | the Proving tile and the Settings switch |
|
|
| Rewards | The address with one Copy; blocks found, this run, balance; the Save your key card (two lines, Show my key, Hide) or the "you pasted your own address" line; Use another address; the dev-fee line; the wallet page | the Settings address block |
|
|
| Node | Node state, height, peers, version, each with a plain line; the chain numbers; the consensus digest with Copy; the next switch with its height and how far away; every switch with the applied ones dimmed; finality; the clock card when the clock is off | the Node and Finality cards |
|
|
| Updates | The version, Check now, Install now when a download is ready, the auto-update switch; remote jobs: Check now, the state line, the history table, the signing key | the Settings version and remote-jobs blocks |
|
|
| Settings | Per card: power cap slider with the watt number (NVIDIA; Apple silicon says it manages its own power), identities stepper, sweep line with Sweep now / Stop / Unpin, the cap-applied or Retry line, draw and temperatures; the sweep switch; start at login; remote jobs allowed; vote on checkpoints; the machine name; the dev fee stated plainly; Copy the log and Show the log, the log and chain folders; Advanced (collapsed): the devnet trust switch, the live page | the Settings panel |
|
|
| Status strip | Unchanged (Notices): updates, remote jobs, the clock, one at a time, under the top bar | the same place |
|
|
| Rail foot | Machine name, rewards address, Logs (the drawer), Quit, version and chain | the bottom bar |
|
|
|
|
Every control in Settings is one switch, one slider or one field with one line of help under it. Nothing was
|
|
removed: the identities stepper, the sweep buttons, the power Retry, the trust switch, the live page, the machine
|
|
rename, the key reveal, the log drawer with its chips, search, ruler and jump controls all still exist.
|
|
|
|
Empty, loading and error states: Mine says "Asking the graphics cards to report in" then "No GPU this app can drive
|
|
was found" (red) with the detect message; the big button is disabled with a reason while no card is on, the engine
|
|
is away or the app quits; Prove says off, needs setup, waiting, proving, submitted or idle, each with a sentence;
|
|
Node says starting, syncing with a percentage and the ETA, synced, restarting, failed or stopped, and the digest
|
|
box says "not printed yet" or "the node is not running"; Updates says "Not checked yet" or "This build has no update
|
|
address"; the jobs table says "No job has run on this machine yet"; Settings says "No card yet"; a lost engine
|
|
turns the pill to "engine away" and the Mine and Node words to "no answer".
|
|
|
|
## 3. Proof
|
|
|
|
The engine was built from this worktree on the Mac under the build lock (`with-lock.sh build nice -n 19 cargo build
|
|
--release -j 4`, rustup's cargo 1.99; Homebrew's cargo 1.69 in PATH cannot read the lock file) and run on its own
|
|
port and data directory in devnet v4 mode (`IGNEUM_APP_BIN` = the installed 0.3.9 bundle's `Resources/bin`,
|
|
`IGNEUM_APP_DATA`, `IGNEUM_APP_LOGS`, `IGNEUM_APP_NODE_DIR` under the session scratchpad, RPC 27610, P2P 27611,
|
|
a scratch `igneum-app.json` next to the binary with the devnet override params, no update manifest) through
|
|
`with-lock.sh run`. The live Mac app's engine, node 1 and the observer were not touched; the test node peered with
|
|
the seed and node 1 and synced 123,559 blocks in about 12 minutes, then the M5 Max mined on it (22 MH/s, digest
|
|
1f4b4425..., the devnet's). The setup flow was walked in the built-in browser pane (Get started, the GPU switch,
|
|
Make me an address, the key sheet, Start mining) and every section was clicked through, the rail driven with the
|
|
arrow keys, and the window checked at 900 x 600.
|
|
|
|
Tests: `node --test notices.test.mjs update-card.test.mjs view.test.mjs` = 20 pass, 0 fail; `cargo test --release
|
|
--bin igneum-app -- digest_comes switches_are pinned_ids` = 3 pass (the three new engine tests, run on the Mac
|
|
under the build lock; the full suites go to PC 2 with the 0.3.11 cut as usual).
|
|
|
|
The PNGs below were taken with the installed Mac host's snapshot mode (`"Igneum Miner" --snapshot <png> --url <the
|
|
test engine> --size 1200x780`, a real WKWebView, Retina 2400 x 1560), in `docs/plans/miner-ui-2/`.
|
|
|
|
| File | Shows | Placeholder or sample |
|
|
|---|---|---|
|
|
| `00-welcome.png` | The welcome screen (unchanged) | none |
|
|
| `01-setup-gpu.png` | Step 1, the M5 Max row with its switch | none |
|
|
| `02-setup-address.png` | Step 2, make an address or paste one | none |
|
|
| `03-setup-key.png` | The one-time key sheet | the key is zeros (`?screen=key` sample) |
|
|
| `04-mine.png` | Mine while mining: the big button, 23 MH/s, the GPU row, the blocks strip | temperature and power say n/a on Apple silicon (the engine has no reading for it) |
|
|
| `05-prove-off.png` | Prove with proving off, the verifier verifying, both pinned ids | none |
|
|
| `06-prove-on.png` | Prove with proving on: Proving (CPU), block 35507 shard 0 | none (the Mac CPU prover was switched on for 25 s, then off) |
|
|
| `07-rewards.png` | Rewards: the address, 343 lifetime blocks, Save your key, Use another address | the balance cell says "--, shown in the wallet, not here yet" (no API) |
|
|
| `08-node.png` | Node synced: height, 2 peers, version 2.1.0, the digest, next switch Fees v1 at 210,000, finality | none |
|
|
| `09-updates.png` | Updates: 0.3.9, Check now, auto-update, remote jobs | this build has no manifest, so "no update address" and "no jobs address" |
|
|
| `10-settings.png` | Settings: the card block, the sweep switch, this machine, dev fee, logs, Advanced collapsed | the NVIDIA power slider is not in the shot (no NVIDIA card on this Mac); its markup is in `setCardHtml` |
|
|
| `11-logs-drawer.png` | Mine with the log drawer open (chips, search, ruler, follow, close) | none |
|
|
| `12-strip-update.png` | The status strip with "Igneum Miner 0.3.7 is available", Install now, Later | `?update=available` sample |
|
|
| `13-strip-job.png` | Updates with a running remote job in the strip and the table | `?job=running` sample |
|
|
| `14-node-syncing.png` | Node while syncing: 59,602 of 123,559 (48%), the next switch from that height | none |
|
|
| `15-mine-syncing.png` | Mine while the node syncs: the button says Stop mining, waiting for the node to sync | taken before the blank marker in the GPU row became `n/a` (it shows a dash) |
|
|
| `16-narrow-900-mine.png` | Mine at 900 x 620 (the installed host's minimum; the new hosts say 600): the icon rail, two-column numbers, the power column dropped | none |
|
|
| `17-narrow-900-settings.png` | Settings at 900 x 620 | none |
|
|
| `18-narrow-900-node.png` | Node at 900 x 620 | none |
|
|
|
|
## 4. Shippable now, placeholder, follow-ups
|
|
|
|
Shippable now: the six sections, the rail, the strip, the drawer, every setting, the three engine fields, the
|
|
hosts' minimum size. The Windows host line is untested on Windows (one `WM_GETMINMAXINFO` case; the 0.3.11 cut
|
|
builds it on the runner as usual). The NVIDIA power slider, telemetry and sweep lines on Settings and the
|
|
temperature and power columns on Mine are rendered from the same state fields the old tiles used, but no NVIDIA
|
|
card was on this Mac, so they are unseen in these shots: the PC screenshot is the first thing to look at after
|
|
the cut.
|
|
|
|
Placeholder: the balance cell on Rewards ("shown in the wallet, not here yet").
|
|
|
|
Follow-ups (engine work, not built here; the budget was three small additions):
|
|
|
|
| Follow-up | What it needs |
|
|
|---|---|
|
|
| Balance on Rewards | the engine reads `eth_getBalance` for the rewards address from the node's EVM RPC every 30 s (`update.rs` has the curl shape) and puts `address.balance_wei` on the state |
|
|
| "Pause while I use the machine" | does not exist in the engine: an idle-input reading per platform and a pause/resume on it; the Settings switch is one line once the field exists |
|
|
| Log export as a file | today Copy the log puts the last 2,000 ring lines on the clipboard and the folder path is shown; a `/api/log/export` that writes the ring to the log folder and reveals it in Finder or Explorer needs a `platform::reveal_path` |
|
|
| Temperature and power on Apple silicon | the engine reads no telemetry for Metal; `powermetrics` needs root, so this stays blank unless a non-root source is found |
|
|
| A per-card "pause this card" without restarting the others | exists already through the row switch (only that card's worker restarts); nothing to do unless the project lead wants a timer |
|
|
|
|
## 5. The 0.3.10 merge: gpu-hotplug (4d122e1) resolved on the new UI
|
|
|
|
The branch was merged with `gpu-hotplug` 4d122e1 (the 0.3.10 tree carries it). The engine, relay and tooling files
|
|
merged by themselves; `app.js` and `app.css` were taken from this branch and the hot-plug UI ported by hand:
|
|
|
|
| Hot-plug state | On the six-section UI |
|
|
|---|---|
|
|
| The strip notices (card added, mining; new card not usable (Code 43); card removed) | the Notices block is gpu-hotplug's, unchanged; `notices.test.mjs` (12) passes |
|
|
| A card the OS reports a problem on (`problem`, "Code 43") | Mine row: name in ember, the word "not usable (Code 43)", the reboot hint under it, the switch disabled; the Mine note repeats the hint; first-run row and Settings card say the same, with no controls |
|
|
| A removed card (`removed_at`) | Mine row dimmed, the word "removed", "unplugged; its worker stopped. The row goes in five minutes."; no switch; Settings card says the same; after five minutes (`gone`) the row is not shown |
|
|
| The counts and the big button | only present cards count (a removed or faulty card never makes the button say "Stop mining") |
|
|
| The name tooltip | the tool's code (gfx1201), the device index, the OpenCL platform, the PCI address (`View.cardTitle`) |
|
|
| The card list sent on a switch | removed and faulty cards are left out, as gpu-hotplug's `readCardRows` does |
|
|
|
|
`view.test.mjs` has an eleventh test for the two states. The whole app crate's unit tests pass on the merged tree
|
|
(99, on the Mac under the build lock, `cargo test --release --bin igneum-app`). `relay/test/parse.test.mjs`
|
|
passes. The Mac engine builds and runs (the same scratch instance as section 3).
|
|
|
|
Build tooling for the Windows compile: `packaging/windows/push-build-inputs.sh --no-node` and
|
|
`node tools/build-job.mjs run --no-node` pack and build the app engine only (no node source, no node build, no node
|
|
tests), so an app-only change compiles on PC 1 in a fraction of the full job.
|
|
|
|
PC 1 job (20:21Z, from this tree at d62b445, `node tools/build-job.mjs run --target ae432dc7 --no-node --targets
|
|
windows --no-tests --no-place`): extract 167 files, `windows app/igneum-app build exit 0 6 s` (the PC's target dir
|
|
was warm), `igneum-app.exe` 2,970,112 bytes sha256 62ce96a9..., PE check ok, coin icon and version block ok, done
|
|
after 13 s. The exe carries the new UI and engine strings ("Prove shards on this machine" x2, `consensus_switches`
|
|
x6, "Consensus params digest:" x1, `card:removed:` x1), so the 6 s was a real compile of the merged sources, with
|
|
gpu-hotplug's Windows-only `detect::adapters` path and this branch's prover change in it. Downloads under the session
|
|
scratchpad (`pc1-app/`), not placed.
|
|
|
|
The ship tool runs no node tests of its own (`tools/ship-app.mjs --self-test` is the version bump), so the only
|
|
list to carry `view.test.mjs` is `.github/workflows/ci.yml` (done in 83a293f).
|
|
|
|
What the PC job does not compile: `app/windows/host.cpp` (the window host with the `WM_GETMINMAXINFO` and
|
|
`WM_DEVICECHANGE` cases) is built by the GitHub runner (`windows.yml`) at the shipper's push, never on a PC; the
|
|
`WM_GETMINMAXINFO` case is three lines of plain Win32 (`MINMAXINFO`, `ptMinTrackSize`) and reads at the runner's log.
|
|
|
|
## 6. The changelog paragraph for the 0.3.10 manifest notes (what the user sees)
|
|
|
|
The miner has six sections behind a rail: Mine, Prove, Rewards, Node, Updates, Settings. Mine has one big Start
|
|
mining / Stop mining button, the hash rate, the blocks found, and one row per graphics card with its name, an on/off
|
|
switch, its hash rate, temperature and power. Prove says in plain words what proving is and shows the shards
|
|
assigned, proven and paid, the verifier and the program ids. Rewards shows the address with one Copy and keeps the
|
|
key backup in its own card. Node shows the sync, height, peers and version with a plain line under each, the
|
|
consensus digest, and the list of planned rule switches with the next one and its height. Updates holds the
|
|
version, Check now and the remote jobs. Settings has one switch or slider per setting with one line of help under
|
|
each: the power cap per card with the watt number, identities, start at login, remote jobs, voting, the dev fee
|
|
stated plainly, the log. The window lays out from 900 x 600. Not in this release: the balance on Rewards (shown in
|
|
the wallet), a "pause while I use the machine" switch, log export as a file, temperature and power on Apple
|
|
silicon.
|
|
|
|
## 7. The branch
|
|
|
|
| Commit | What |
|
|
|---|---|
|
|
| 83a293f | the UI pass, the three engine additions with tests, the hosts' minimum size, this plan and the 19 screenshots (the blank marker in a GPU row is `n/a`, not a dash: copy law) |
|
|
| 364feef | this plan's hash line |
|
|
| d62b445 | Merge gpu-hotplug 4d122e1: the hot-plug states on the new UI, `--no-node` for the build tools |
|