Gunnar

nordisk/holger

.nornir/common-framework-guide.md

<!-- nornir:class: guide -->
# Guide — About + the jera-backed Tools demo

> **Class:** `guide`. Design: [`common-framework-design.md`](common-framework-design.md).
> Plain-language: [`common-framework-for-idiots.md`](common-framework-for-idiots.md).

## About holger

- **Open it:** the `ℹ About` button in the header, or the command palette (Ctrl-K →
  "About holger"), or the menu bar's `Help · About holger`.
- **What it shows:** the holger hero logo, the wordmark, the running **version**, the
  tagline, and the shared framework components holger is built on (skidbladnir ·
  nornir-service · jera · facett). Dismiss with the window ✕ or `Close`.
- **Headless:** the identity is observable without a screen —
  `app.state_json()["about"]` carries `open`, `wordmark`, `version`, and `framework`.

## Sign in (the shared device-code pane)

- **Open it:** the **Sign in** tab (or the command palette → `signin`). It mounts the
  shared `facett_auth_ui::LoginPane`, the SAME reusable pane korp uses.
- **Flow:** Sign in → a **user-code + verification URL** (RFC 8628 device code, via edda's
  `nornir-auth-client`) → poll → the signed-in **subject** shows, with credential **names**
  only (never a token value) → Sign out. Config is read from the environment.

## Responsive shell (auto-fold)

The tabbed shell is the shared `facett_app::scene`. On a narrow (**phone-class**, < 600 pt)
window the `⚓ static` toggle + look switcher fold behind one `⚙ Controls` drawer so the tab
canvas keeps the screen; `state_json.controls_folded` / `state_json.scene` report the fold.

## Tools · Demo appliance (start a container through jera)

The demo stands up a small **pinned** artifact registry
(`docker.io/library/registry:2.8.3`) as a tracked **jera** job — the same job manager
holger-server routes promotions/GC through.

- **Run it:** Tools tab → `6 · demo appliance` → **Start demo appliance… (as a jera
  job)**. The pane shows the image, name, port, URL, and — after clicking — the jera
  **job id** and status.
- **Daemon-free by default:** the standard build records the bring-up as a durable
  `BOOT_CONTAINER` job (status `dispatched`) without a container runtime — you can list
  it later (`nornir jobs`). Nothing is spawned ad-hoc.
- **Boot it for real:** build with the `containers` feature —

  ```bash
  cargo run -p holger-server-ui --features gui,containers --bin holger-server-ui
  ```

  This turns on `jera/container-oci` (→ draupnir's OCI engine), so clicking Start
  actually boots the registry; reach it at `http://127.0.0.1:5000`. Override the image
  with `HOLGER_DEMO_IMAGE=…`.

## Where the ledger lives

`HOLGER_DATA/holger-server-ui-jobs/jobs.redb` when `HOLGER_DATA` is set, else a temp dir. It
is the same `jera::jobs::JobStore` redb list every suite app writes to.