diff --git a/configs/bank-landing/README.md b/configs/bank-landing/README.md
index 68f290f..d59e83a 100644
--- a/configs/bank-landing/README.md
+++ b/configs/bank-landing/README.md
@@ -103,31 +103,11 @@ taler-wallet-cli exchanges accept-tos https://exchange.hacktivism.ch/
---
-## Live stats (central host collector · hernani systemd)
+## Live stats (in bank container)
-**Primary:** user **hernani** on koopa runs `taler-landing-stats.timer`
-(`scripts/taler-landing/`). That process full-scans **all bank accounts**
-(except `exchange` double-count), paginates every ledger, writes
-`stats.json` with **GOA alt units** (`amount_alt` / Kilo-GOA / Mega-GOA / …),
-and refreshes exchange + merchant stats the same way.
-
-```bash
-# on koopa as hernani
-./scripts/taler-landing/install-landing-stats-host.sh
-sudo loginctl enable-linger hernani
-systemctl --user start taler-landing-stats.service
-```
-
-See **`scripts/taler-landing/README.md`**.
-
-**Fallback:** in-container `landing-stats.sh` (below) if the host timer is down.
-It now also scans admin + all users (skips only `exchange`).
-
-## Live stats (in bank container · fallback)
-
-Stats are **not** computed in the browser. A small script can still run
-**inside the bank container**, query libeufin (all accounts), and write a
-public JSON file next to the landing assets.
+Stats are **not** computed on the laptop or host browser. A small script runs
+**inside the bank container**, queries libeufin for the demo funding account
+(`explorer`), and writes a public JSON file next to the landing assets.
| Piece | Path / role |
|-------|-------------|
@@ -151,9 +131,9 @@ public JSON file next to the landing assets.
| Env | Default | Meaning |
|-----|---------|---------|
-| `TX_DELTA` | `-200000` | per-account ledger window (`GET …/transactions?delta=`) |
-| `ACCOUNTS_DELTA` | `-10000` | account-list window (`GET /accounts?delta=`) |
-| `MAX_SCAN_ACCOUNTS` | `0` (unlimited) | max usernames to scan; `0` = all |
+| `TX_DELTA` | `-50000` | per-account ledger window (`GET …/transactions?delta=`) |
+| `ACCOUNTS_DELTA` | `-500` | account-list window (`GET /accounts?delta=`) |
+| `MAX_SCAN_ACCOUNTS` | `500` | max usernames to scan |
Older defaults (`TX_DELTA=-100`, `MAX_SCAN_ACCOUNTS=80`) **undercounted** credits/withdraws
and account totals on this stack. Empty accounts often return **HTTP 204** (no body) —
diff --git a/configs/bank-landing/goa-amount.js b/configs/bank-landing/goa-amount.js
deleted file mode 100644
index 67c3859..0000000
--- a/configs/bank-landing/goa-amount.js
+++ /dev/null
@@ -1,169 +0,0 @@
-/* Compact GOA / CUR:amount display using currency alt_unit_names.
- * Large values → "1.23 Mega-GOA" (title = full GOA:n) so landing tiles fit.
- */
-(function (global) {
- "use strict";
-
- var DEFAULT_ALT = {
- "24": "Yotta-GOA",
- "21": "Zetta-GOA",
- "18": "Exa-GOA",
- "15": "Peta-GOA",
- "12": "Tera-GOA",
- "9": "Giga-GOA",
- "6": "Mega-GOA",
- "3": "Kilo-GOA",
- "0": "GOA",
- "-1": "Deci-GOA",
- "-2": "Centi-GOA",
- "-3": "Milli-GOA",
- "-6": "Micro-GOA",
- "-7": "Deci-Micro-GOA",
- "-8": "Atomic-GOA"
- };
-
- var THRESHOLD = 1000;
-
- function parseAmount(s) {
- if (s == null || s === "") return { cur: "GOA", val: 0 };
- if (typeof s === "number") return { cur: "GOA", val: s };
- var t = String(s).trim();
- var i = t.indexOf(":");
- if (i < 0) return { cur: "GOA", val: parseFloat(t) || 0 };
- return {
- cur: t.slice(0, i) || "GOA",
- val: parseFloat(t.slice(i + 1)) || 0
- };
- }
-
- function fmtCoeff(v) {
- if (!isFinite(v)) return "?";
- var a = Math.abs(v);
- if (Math.abs(a - Math.round(a)) < 1e-9) return String(Math.round(v));
- var s = v.toFixed(4).replace(/\.?0+$/, "");
- return s;
- }
-
- function baseStr(cur, val) {
- if (!isFinite(val)) return String(cur) + ":?";
- if (Math.abs(val - Math.round(val)) < 1e-9) return cur + ":" + Math.round(val);
- return cur + ":" + String(val).replace(/(\.\d*?[1-9])0+$/, "$1").replace(/\.0+$/, "");
- }
-
- /**
- * @param {string|number} amount
- * @param {object} [altMap]
- * @returns {{ display: string, title: string, raw: string, usedAlt: boolean }}
- */
- function format(amount, altMap) {
- if (amount == null || amount === "") {
- return { display: "—", title: "", raw: "", usedAlt: false };
- }
- // Prefer server-provided alt if caller passes object {amount, amount_alt}
- if (typeof amount === "object" && amount) {
- if (amount.amount_alt) {
- var rawO = amount.amount || amount.amount_full || String(amount.amount_alt);
- return {
- display: String(amount.amount_alt),
- title: amount.amount_full || rawO,
- raw: String(rawO),
- usedAlt: true
- };
- }
- amount = amount.amount || amount.amount_full || "";
- }
-
- var alt = altMap || global.__GOA_ALT_UNITS || DEFAULT_ALT;
- var p = parseAmount(amount);
- var raw = baseStr(p.cur, p.val);
- // Foreign currencies must not pick up Kilo-GOA / Mega-GOA labels
- var baseName = (alt && alt["0"]) || p.cur;
- var curU = String(p.cur || "").toUpperCase();
- var baseU = String(baseName || "").toUpperCase();
- if (curU && curU !== "GOA" && (baseU === "GOA" || baseU.indexOf("GOA") !== -1)) {
- return { display: raw, title: raw, raw: raw, usedAlt: false };
- }
- if (p.val === 0) {
- return { display: raw, title: raw, raw: raw, usedAlt: false };
- }
- if (Math.abs(p.val) < THRESHOLD) {
- return { display: raw, title: raw, raw: raw, usedAlt: false };
- }
-
- var scales = [];
- Object.keys(alt || {}).forEach(function (k) {
- var n = parseInt(k, 10);
- if (!isNaN(n)) scales.push({ sc: n, name: String(alt[k]) });
- });
- scales.sort(function (a, b) { return b.sc - a.sc; });
-
- var abs = Math.abs(p.val);
- var chosen = null;
- for (var i = 0; i < scales.length; i++) {
- var unit = Math.pow(10, scales[i].sc);
- if (!(unit > 0)) continue;
- var coeff = abs / unit;
- if (coeff >= 1) {
- chosen = {
- sc: scales[i].sc,
- name: scales[i].name,
- coeff: p.val >= 0 ? coeff : -coeff
- };
- break;
- }
- }
- if (!chosen || chosen.sc === 0) {
- return { display: raw, title: raw, raw: raw, usedAlt: false };
- }
- var short = fmtCoeff(chosen.coeff) + " " + chosen.name;
- return {
- display: short,
- title: short + " (" + raw + ")",
- raw: raw,
- usedAlt: true
- };
- }
-
- function setText(el, amount, altMap) {
- if (!el) return;
- var f = format(amount, altMap);
- el.textContent = f.display;
- if (f.title && f.title !== f.display) el.setAttribute("title", f.title);
- else el.removeAttribute("title");
- }
-
- function setById(id, amount, altMap) {
- setText(document.getElementById(id), amount, altMap);
- }
-
- /** Prefer amount_alt from stats row, else format amount. */
- function pick(rowOrAmount, altMap) {
- if (rowOrAmount && typeof rowOrAmount === "object") {
- if (rowOrAmount.amount_alt) {
- return format({
- amount: rowOrAmount.amount,
- amount_alt: rowOrAmount.amount_alt,
- amount_full: rowOrAmount.amount_full
- }, altMap);
- }
- return format(rowOrAmount.amount || rowOrAmount.total_amount, altMap);
- }
- return format(rowOrAmount, altMap);
- }
-
- function rememberAlt(stats) {
- if (stats && stats.alt_unit_names && typeof stats.alt_unit_names === "object") {
- global.__GOA_ALT_UNITS = stats.alt_unit_names;
- }
- }
-
- global.GoaAmount = {
- format: format,
- setText: setText,
- setById: setById,
- pick: pick,
- rememberAlt: rememberAlt,
- DEFAULT_ALT: DEFAULT_ALT,
- THRESHOLD: THRESHOLD
- };
-})(typeof window !== "undefined" ? window : globalThis);
diff --git a/configs/bank-landing/index.html b/configs/bank-landing/index.html
index bd47143..f172304 100644
--- a/configs/bank-landing/index.html
+++ b/configs/bank-landing/index.html
@@ -1491,34 +1491,6 @@ tw run-until-done && tw balance
-
-
-
-