Changelog

Changelog

Version history and notable updates

v0.36.0

  • FeatureNew Revenue page (/revenue) showing the buy side of credits: total USD revenue with a cumulative sparkline, completed purchases, ALEPH distributed to the network and ALEPH market-bought from stable-coin payments, a paid-in split (ALEPH vs stable coins), a recent-purchases list, and a monthly breakdown. It reads the signed `buyflow` aggregate published hourly by the buy-flow pipeline — the buy-side counterpart to the spend-side Credits page.

v0.35.1

  • UIThe Earnings tab's VM count is now range-true: "VMs earning (24h/7d)" counts the VMs that actually generated earnings in the selected window, matching the per-VM table below. At 30d the count is omitted with a note that the 30d execution feed is too heavy to load (~250 MB). The old "VMs hosted (avg)" number replayed the scheduler's allocation ledger, which never drops missing VMs, so a node whose VMs all died a week ago still showed ~24 hosted next to near-zero earnings. The chart line and panel-spark caption are relabeled "VMs scheduled" since allocation history is what they show.

v0.35.0

  • FeatureThe Node Earnings tab now sources its numbers from the protocol's authoritative rewards feed instead of a client-side reconstruction — including the wage subsidy, previously invisible on this tab (for CCNs it is often the dominant source). The ALEPH-accrued KPI gains a by-source bar (Credits / Holder / Min. wage), matching the wallet revenue card's vocabulary.
  • FeaturePer-VM earnings figures now reflect the realized execution share from the rewards feed instead of the hardcoded 60% split. For reward addresses with multiple CRNs, the chart splits per-node values by exact per-bucket execution weights at 24h/7d (from an execution-only expense slice, ~10MB instead of the ~112MB unfiltered feed) and falls back to a live VM-count proxy at 30d, where the per-VM table covers the trailing 7 days.
  • UIThe earnings chart renders immediately from rewards data and refines its multi-node split when execution data arrives (a small "Refining node split…" hint shows meanwhile). The per-VM breakdown has its own loading and error states, so an execution-feed timeout no longer blocks the headline numbers, and both tabs show a clear message when the rewards feed is unreachable.
  • FixNode and network-panel earnings sparklines no longer download the network-wide credit-expense feed — they now cost two lightweight rewards queries. A floating-point residue no longer renders as a scientific-notation "Other CRNs" segment in the reward address breakdown.
  • RefactorThe bucket-options machinery (SummaryOptions, perNodeBuckets, perVmInWindow) was removed from computeDistributionSummary — the credits page is its only remaining consumer.

v0.34.1

  • FixThe wallet Refresh button now also refetches the node revenue card (rewards + distribution queries were missing from its invalidation set), and the revenue accrual window advances while the page stays open instead of freezing at its mount time — previously the "live" numbers only updated on a full page reload.

v0.34.0

  • FeatureThe wallet view's rewards section is now a node-owner revenue view sourced from the protocol's authoritative rewards feed (credit.aleph.im /rewards/time-series) instead of a client-side reconstruction. It surfaces the wage subsidy — the "minimum wage" that decays to zero over time, previously invisible and worth ~18–22% of node-owner revenue — framed around the payout cycle: an owed-this-cycle total with a days-since-last-distribution accrual line, a by-source breakdown (credits / holder tier / wage), a per-node breakdown, and a last-payment panel showing the latest distribution amount and date.
  • RefactorWallet reward numbers are now anchored to the per-address totals from the rewards API and split per node by each CRN's live VM count and CCN score weights. The old hardcoded 60/15/20 distribution split is retired for the wallet path — computeWalletRewards and the useWalletRewards hook were removed.
  • FixThe wallet "by node this cycle" breakdown now loads reliably, and the rewards query is faster. Per-node weighting uses each CRN's live VM count instead of downloading the full network credit-expense feed (which reached ~750MB for a payout cycle and could hang the panel), and rewards time-series requests are aligned to whole-hour bounds so the rewards API serves them from cache.
  • FixPer-node revenue figures no longer show NaN for addresses with a zero source (e.g. no credit revenue) — the rewards API omits breakdown keys for zero sources and the missing values poisoned the per-node math. Sparse responses are now normalized to zeros, and a floating-point residue no longer renders as a tiny scientific-notation "Unattributed" row.
  • UIStatus dots that duplicated an adjacent status badge were removed on the Nodes table, the Issues node perspective, and the wallet's Nodes list — the badge alone carries the status. Dots remain where they are the only status signal (detail headers, network panels, health rows).

v0.33.0

  • FeatureThe VMs page now has a retention-window selector (7d / 30d / 90d / All, default 7d) that replaces the "Show inactive VMs" toggle. The window is the always-on lens — status pills slice within it — keying on each VM's most recent activity (last observed, updated, or allocated). An explicit lookup (hash/name search or owner address) bypasses the window so a specific VM always surfaces. The window persists via `?retention=`.
  • UIOverview "Total VMs" now counts VMs active in the last 7 days (was: all active-status VMs ever), and the Issues page scopes discrepancies to the last 30 days — so stale long-tail rows no longer inflate either surface.

v0.32.3

  • FixSearching the VMs page (by hash, name, or owner address) now surfaces matches in the All tab regardless of status — previously a `scheduled` or other inactive VM showed only under its status pill and read as missing from All. An explicit lookup now bypasses the default "Show inactive VMs" cull the same way clicking a status pill does.

v0.32.2

  • UIVM hashes now show their metadata name inline on the node detail Overview tab's Virtual Machines list and on the Earnings tab's Hosted VMs breakdown — matching the wallet's Credit Rewards pattern.
  • UIVM detail page reshuffle: Requirements is renamed Configuration (it's what the user picks at creation, not a platform requirement) and moves up directly below Details. Allocated Node and Observed Nodes now sit side-by-side on desktop, with observed-node hashes also showing their node names inline.

v0.32.1

  • UIThe VM detail panel and detail page now lead with the VM's metadata name (and a StatusDot) when one is set, falling back to the hash otherwise — mirrors the node header pattern.

v0.32.0

  • FeatureEach CRN now shows its capacity in Compute Units (CU) — total, used, and available. Total CU is the node's limiting resource across vCPU, RAM, and disk (1 CU = 1 vCPU / 2 GB / 20 GB, or 1 vCPU / 6 GB / 60 GB while the node has a free GPU); available CU is the scarcest of its remaining resources once every hosted VM's requirements are subtracted. The Nodes table swaps its vCPUs column for CU (total capacity, formula in the cell tooltip); the node detail view, quick-peek panel, and network graph CRN panel show total, used, and available.
  • FeatureThe Nodes advanced filters gain a CU range slider alongside the existing vCPUs and Memory sliders.
  • FixThe node earnings sparkline no longer shows `NaN VMs avg` on GPU nodes — their history carries event types the VM-count replay didn't recognise, which are now ignored instead of breaking the average.

v0.31.1

  • UIThe VM quick-peek detail panel drops its History section — history lives on the full detail page. The amber issue callout (the reason a VM is flagged) now shows in the panel too, not just the page.
  • UIWhen a VM's scheduler status differs from its derived status, the divergence shows as a dedicated `Scheduler status` row next to `Status` (detail panel) or in the Details card (detail page) — the issue callout is now prose only and no longer repeats the derived status.

v0.31.0

  • UIThe world map on the Overview hero is now clickable — it navigates to the `/network` graph. The expand icon lost its disabled `Coming soon` state and brightens on hover.

v0.30.0

  • FeaturePortrait `/network` now renders a three-section summary (top 10 CCNs, top countries, top reward addresses) instead of the broken CCN list whose links pointed at a graph that didn't render. CCN rows link to `/nodes?view=<hash>`, reward address rows link to `/wallet?address=<addr>`, country rows are informational. Each section has a `See all N →` inline expand toggle.
  • UIPortrait `/network` shows a quiet `↻ Rotate device for full network graph` hint at the top — landscape (≥ md) still renders the full force-directed graph.
  • RefactorPromoted `dotStatusFor` from `network-detail-panel.tsx` to `network-graph-model.ts` so the portrait summary and the desktop detail panel share the same status mapping.

v0.29.0

  • FixMobile: per-page Refresh / Recheck buttons are dropped on phones — the dashboard auto-polls every 15–30s, so the inline row added in 0.28.0 was redundant. Desktop layout is unchanged. Wallet keeps its `Open in Explorer →` link on mobile.
  • FeatureVM detail page now shows an amber issue callout when the VM is in a discrepancy state (orphaned / missing / misplaced / duplicated / unschedulable). When the scheduler-reported status diverges from the derived one, a Derived / Scheduler badge pair makes the divergence visible. Previously this lived only in the Issues panel on desktop.
  • FixNode and VM detail pages: history tables now paginate (25 / 50 / 100 rows per page) instead of using a `Show N more` toggle. The old toggle locked the browser when a single VM accumulated 16k+ history entries.
  • FixIssues page: on mobile, tapping a row routes straight to the full detail page (matching how Nodes and VMs already work). The slide-in panel only opens on desktop. The panel's `Observed on` row also truncates to the first hash + `+N more` so an orphaned VM observed on hundreds of nodes doesn't explode the panel.
  • UIMobile list pages now have consistent row heights across Nodes / VMs / Issues. Some columns (Name, CPU, Issue) were squeezing content into multi-line wraps at narrow widths; they now stay single-line and the table scrolls horizontally instead.
  • FixMobile filter toolbar no longer jumps between perspectives. The Issues page tabs row used to grow by 20px when switching from VMs to Nodes (the status tab list mis-measured its height when long labels squeezed in flex layout); fixed by stacking the toolbar vertically on phones and pinning tab widths so labels never wrap.

v0.28.0

  • UIMobile: full-screen drop-down menu replaces the side drawer. Hamburger moves to the top-right and is replaced by the menu's × button when open. Cross-product tabs and theme toggle live in the menu's footer band, freeing up vertical space at the top of the page.
  • UIMobile: per-page Refresh / Recheck actions move from the page header to an inline row above page content (Nodes, VMs, Wallet, Network Health, Issues). Desktop layout is unchanged.
  • FeatureMenu close behaviors: × button, backdrop, route change, Escape key, and md+ resize all close the menu. Body scroll is locked while the menu is open. The panel uses `role="dialog"` and moves focus to the × button on open.

v0.27.0

  • FixSidebar is now an off-canvas drawer on phones — tap ☰ in the header to slide it in, tap the dimmed backdrop or pick a nav item to close. The drawer regressed during the May shell redesign; this restores it.
  • UICredits page: on phones, the flow diagram is replaced by a vertical breakdown of Storage and Execution flows (CCN / CRN / Stakers / Dev fund) so the percentages and ALEPH amounts are actually readable. Desktop keeps the SVG diagram.
  • UIWide tables on Wallet, Credits, and the Earnings tab now stack as cards on phones — each row becomes a card with the primary identifier on top and supporting fields below. Desktop keeps the full table.
  • UIEarnings chart on phones now shows the bucket details inline below the chart instead of as a floating tooltip that could fall off the screen.

v0.26.1

  • UICross-app tabs in the top product strip (Cloud / Explorer / Swap) now show a small external-link affordance so it's clear they take you off-app. Network stays unmarked since it's the current app.
  • InfraDesign system bumped from 0.20.0 to 0.23.1.

v0.26.0

  • FeatureReward address now shows on the node detail card and the full detail page (CRNs picked it up from the corechannel state — the CCN side already had it).
  • UINode detail card slimmed down to identity, status, and earnings. Resources usage bars and the History list moved off the side panel — they live one click away on the full detail page. The card is now a quick-peek triage surface, not a full inspector.
  • UICharts and sparklines got fluid smooth curves and a gradient fill under the primary line so the earnings spark on the detail card, the Earnings tab chart, and the cumulative-revenue spark on Credits all share the same depth and feel.
  • UISidebar nav: Network Health moved out of the Network section and into Operations next to Issues. The Network section is reserved for topology views (the Graph); diagnostic surfaces live together under Operations.

v0.25.1

  • UIPage header gets a transparent background so the radial accent glow bleeds through behind the title row, and the title itself is tuned down to a smaller, dimmed weight so it reads as quiet metadata rather than competing with the page's main heading.

v0.25.0

  • UIChrome polish: the rounded surface now envelopes the page header instead of starting below it, so the chrome flows continuously from the product strip down through the page title and into the main content. The product strip itself is taller (54px) and loses its bottom border, so the seam between the cross-app row and the page row disappears.
  • UISidebar brand slot drops the duplicate Aleph logomark — the cross-product mark in the product strip is the anchor; the sidebar identifies the sub-app (Network) with just the wordmark, and goes quiet when collapsed.
  • UIPage header Refresh buttons are now quieter text links with an icon, matching the rest of the chrome's restraint. Network Health's Recheck and Wallet's Refresh follow the same pattern.
  • FeatureOperations section in the sidebar starts collapsed by default — Issues is one click away when you need it, instead of always-on noise next to your daily nav. The other three sections (Dashboard / Resources / Network) keep their default-open behavior.
  • InfraSidebar version link adopts the new `footer` prop on `AppShellSidebar` (from `@aleph-front/ds@0.19.0`) — it auto-hides and the collapse chevron re-centers when the sidebar shrinks to the rail. Replaces a hand-rolled `rail-hide` workaround.

v0.24.1

  • FeaturePage titles in the new chrome row now own themselves per page (Overview, Credit Expenses, Network Graph, Network Health, Issues, Changelog) via `usePageHeader`, and the Nodes / VMs titles become data-aware once their fleet loads (e.g. `Nodes · 542 total`, `VMs · 1,238 total`).
  • FeatureRefresh actions land in the page header on Nodes, VMs, Network Health, Issues, and Wallet — one click re-runs the underlying React Query refetch (or, on Network Health, the endpoint probe pass). The button disables and shows `Refreshing…` while a request is in flight.
  • UINetwork Health's body-level Recheck button moves into the page header. The Last Checked timestamp stays where it was — it's information, not a verb.
  • FeatureWallet page header gains an `Open in Explorer →` link beside Refresh, deep-linking the current address to explorer.aleph.cloud. The title shows a truncated address (`0x1234…5678`) so you can tell at a glance which wallet you're looking at.

v0.24.0

  • FeatureShared product strip across the top of every page: Aleph logomark, four cross-app tabs (Cloud · Network · Explorer · Swap), and a clear signal that the dashboard is part of the Aleph product family. Cross-app navigation is one click away from anywhere.
  • FeatureSidebar gets accordion sections (Dashboard / Resources / Network / Operations) and a built-in collapse toggle that shrinks it to an icon rail. Section open/closed state and rail-vs-expanded state both persist in localStorage, so each operator's preferred layout sticks across reloads.
  • UITheme toggle moved from the old page header into the product strip's right slot, so it's available consistently across every Aleph app that adopts the shared shell.
  • UIIssues and Network Health are now top-level sidebar entries (under Operations and Network respectively) instead of being hidden behind a "More" overflow popover. One less click to reach the diagnostic surfaces.
  • InfraNew page header slot wired into the shell, ready for per-page Refresh actions and entity-aware titles in the next release. For now the header uses a `routeTitle(pathname)` fallback so every route ships with a sensible title without per-page changes.

v0.23.0

  • FeatureEarnings now include protocol-subsidized holder-tier usage. Each expense message exposes a new `hold` array alongside `credits` (same shape, same `credit_price_aleph` conversion); both are merged into one entry list before distribution, so CRN/CCN/staker shares and the recipient table reflect the combined ALEPH paid by both customers and the protocol. Each parsed entry carries `source: "credits" | "hold"` for future UI surfacing. The legacy `rewards` array (deprecated 2026-05-14) is explicitly ignored to avoid double-counting any unamended messages.
  • UINode Earnings tab per-VM breakdown table gets a **Payment** column showing whether each VM is `Credits` (customer-paid) or `Hold` (protocol-subsidized holder-tier). Outline Badge per row — neutral for credits, info-colored for hold — so operators can see at a glance which slice of their earnings comes from each payment path.

v0.22.0

  • FeatureEarnings tab gets a **Reward address breakdown** Card between the chart and the per-VM / linked-CRN table on both CRN and CCN node detail views. Horizontal stacked bar splits the reward address's window earnings into four buckets — this node / other same-kind nodes / cross-kind ops / staking — so operators using one reward address across many nodes can see this node's contribution in portfolio context. Bidirectional hover: hovering a segment or a legend row dims the rest. When the reward address only earned from this node in the window, a one-liner caption replaces the bar. `View full wallet →` deep links to `/wallet?address=`. No new API calls — built on the existing `summary.recipients`. Switching range (24h → 7d → 30d) now shows scoped skeletons — the truly range-dependent values (ALEPH accrued and VMs hosted avg KPI cards, chart area, reconciliation bar + values, per-VM ALEPH column) swap to inline placeholders during the refetch, while Score, Status, Linked CRNs, VM hashes, swatches, and segment labels keep their real values.

v0.21.0

  • FeatureThe Earnings tab chart now supports hover — move the cursor over the chart to see a bucket-anchored crosshair and a tooltip card with the bucket time, ALEPH value, and secondary count (VMs for CRN, linked CRNs for CCN). Time format adapts to bucket granularity: `MMM D · HH:MM` for the 24h range (hourly buckets), `MMM D` for 7d / 30d (daily buckets).
  • FeatureNetwork graph CRN/CCN detail panels and the `/nodes` side panel now show a static **Earnings · 24h** sparkline: a mini dual-line chart with ALEPH earned + VM count (CRN) or linked-CRN count (CCN) over the last 24h, plus a caption like `12.40 ALEPH · 3.2 VMs avg`. The `/nodes` side panel drops its truncated VMs list block in exchange — the spark covers the same VM-count signal, and the full VM list is still reachable via `View full details →`.
  • UIEarnings tab VM breakdown: the `+ N more` row is now a click target — expand it to see every VM that earned in the window, collapse with `Show less`.

v0.20.0

  • FeatureNode detail view has a new **Earnings tab** for both CRNs and CCNs at `/nodes?view=<hash>&tab=earnings`. Pick a trailing window (24h / 7d / 30d) and see ALEPH accrued plus the delta vs the previous same-length window, a dual-line chart overlaying ALEPH against VM count (CRN) or linked-CRN count (CCN), and a per-VM breakdown (CRN) or linked-CRN status list (CCN). Numbers come from the existing `aleph_credit_expense` feed using the protocol's distribution split — no new API calls. The chart's diagnostic angle (earnings dropped → VM count dropped) is the operator's primary failure mode.
  • FeatureCCNs are finally viewable at `/nodes?view=<ccn-hash>`. The scheduler API only knows about CRNs, so CCN hashes used to land on "Node not found" — including the "View full details →" link from the network graph's CCN panel. CCNs now route to a dedicated detail view backed by the corechannel aggregate: hash, score, owner, reward, total staked, attached CRNs list, stakers table, plus the new Earnings tab.

v0.19.0

  • FeatureVMs page: new **Owner address** filter in the advanced filter panel. Paste a 0x-prefixed wallet address to see only that owner's VMs — the query goes server-side (`?owners=`) so the payload shrinks from thousands to tens. Debounced 500ms, validated mid-typing without an inline error, persists via `?owner=`, and the active-filter dot on the toolbar lights up when set.

v0.18.0

  • FeatureScheduler WebSocket cache invalidation: a single app-wide WebSocket subscribes to the scheduler's new event stream and invalidates the affected React Query caches per event, so every existing page — Overview, Nodes, VMs, Issues — refreshes in near-real-time as VMs are scheduled, migrated, or fail to schedule. Polling stays as a fallback, so disconnected periods don't lose correctness. The Network Health page gains a new "WebSocket stream" row that surfaces connection state, event count, and last-event relative time.

v0.17.0

  • FeatureMigrating VMs are now first-class: a new **Migrating** tab on `/vms` (now 4 visible status pills instead of 3), an amber warning pill across all surfaces, an Owner row sourced directly from the scheduler on VM detail, and a Migration section showing target node + time started.
  • FeatureNetwork graph: migrations now render as **amber arrows** from source to target CRN, always-on (not gated by a layer toggle). The CRN detail panel shows a Migrations row with inbound/outbound counts.
  • FeatureIssues page: when the scheduler's reported `scheduling_status` diverges from our derived `status`, Schedule vs Reality shows both side-by-side so the discrepancy has concrete grounding.

v0.16.0

  • FeatureNetwork graph CRN highlights: CRNs with score below 0.8 or that the scheduler reports as **unreachable** now wear the same amber warning ring used for understaked CCNs. The detail panel surfaces the cause — "Unreachable — scheduler health check is failing." or "Low score (X.XX) — below the 0.8 threshold." — with the StatusDot and Status Badge flipping to amber to match. One visual vocabulary across CCN and CRN alert states.

v0.15.0

  • FixNetwork graph activation thresholds: a CCN now needs **500,000 ALEPH total staked** to activate (was incorrectly described as 700,000), and the owner address must hold **200,000 ALEPH on-chain** before others can stake on the node (a precondition that wasn't enforced before). Dimming is now driven from the actual stake numbers — not the API's `status` string — so the visual self-corrects when stake moves in either direction.
  • FeatureOwner-balance lookups for CCN owners: a new `getOwnerBalances()` API + `useOwnerBalances` hook fetches each CCN owner's on-chain ALEPH balance (summed across chains) from api2.aleph.im. Powers the new 200k owner gate without requiring owners to be in their own `stakers` map (which they almost never are).
  • UIUnderstaked CCNs now use a **warning ring** — kind color body at full opacity wrapped in an amber dotted ring — instead of the previous dim+grey-ring treatment that hid the alert state. Pending nodes are unchanged (grey body + grey pending ring). Detail panels surface the cause inline: "Not yet active — activation needs 500,000 ALEPH total staked" or "Owner must hold 200,000 ALEPH before others can stake on this node".

v0.14.0

  • FeatureNetwork graph: CCN/CRN nodes now show three distinct states. **Operational** (default) — full color. **Pending** (registered but no attached CRNs / no parent CCN) — grey with a dotted outer ring, force-clustered into a satellite group off to the side so they don't compete with the operational topology. **Understaked** (CCN with attached CRNs but under the 700,000 ALEPH activation threshold) — kind color (purple) with a dotted outer ring, stays in place to preserve its structural connections. Detail panels surface the state inline: "Registered but not yet adopted by a CCN" / "Registered but has no attached CRNs yet" / "Not yet active — activation needs 700,000 ALEPH staked".
  • FeatureCRN detail panel now shows a Score row (formatted as percentage), matching the existing CCN score row.
  • FixLinked CRNs now show a green StatusDot in the detail panel header and a green-outlined Status badge — they used to fall through to a yellow "degraded" / amber "warning" state because the status mapping only knew about CCN's "active" status.
  • UICCN score in the detail panel is now formatted as a percentage (e.g. "92.5%"), matching the new CRN score row.
  • UINetwork graph defaults: only the structural (CCN↔CRN) layer is on by default now. The staker layer used to be on too, but its cliques created too much first-paint noise — one toggle away when you want it.
  • UINetwork graph CRN labels now require a higher zoom level to appear (3× instead of 1.5×) so focusing a country with the geo layer on no longer drowns the cluster in overlapping CRN names. CCN and country labels keep their lower thresholds.

v0.13.0

  • FeatureNetwork graph search: pressing Enter on a node hash or name now zooms in on the matching node and its 1-hop neighborhood — no more squinting at the dot that just got selected. Country searches still focus the country's subgraph; address searches use their own fit path.
  • FeatureNetwork graph address search: a 0x address now opens a dedicated panel (right side) listing the copyable wallet, link count, and a Staking section showing every CCN the address stakes on with per-position and total ALEPH. The spotlight dims everything outside the wallet's footprint — nodes where the address is the staker, owner, or reward target stay full opacity, the rest fade. Pulse rings still mark the matches.
  • FeatureNetwork graph CCN/CRN cards: new Location row with flag emoji and country name (e.g. 🇫🇷 France) — visible regardless of whether the Geo layer is on, since country attribution is now independent of the layer toggle.
  • UINetwork graph search field: same width (280px) as the detail cards so the column reads as one stack, and the info-icon button shrunk to a 28×28 target tight against the input (was a chunky pill-shaped lozenge with extra padding).
  • UINetwork graph panels: closing the node detail panel (× button) now also clears the search input — previously you had to clear the field separately.
  • FixNetwork graph country nodes rendered as flat black circles because the cyan CSS token's OKLCH chroma was out of sRGB gamut at hue 200° and got silently dropped by Lightning CSS. Lowered chroma to a safe value; country nodes now render in their intended cyan-teal.

v0.12.0

  • FeatureNetwork graph: new optional 'Geo' layer (off by default) groups located CCN/CRN around a per-country hub node. Country becomes a top-tier node — click for a flag + CCN/CRN/owner counts in the detail panel, focus to drill into the country's subgraph, or search by name ("France") or ISO code ("FR"). Country labels stay visible at every zoom level. Layout is force-driven — countries are placed by cluster mass, not real-world coordinates, so heavy clusters spread out and small ones nestle between.
  • UIGeo layer: country↔node connections render as thin country-tinted dashed tethers so each country reads as an explicit hub-and-spoke hub. Selecting a country brightens its tethers; selecting one of its located nodes recolors that one tether to the node's kind color.
  • UINetwork graph search: new info icon left of the search input that lists the four supported query types (node hash, node name, 0x address, country) and notes country search requires the Geo layer.
  • FixNetwork graph focus chain: the pill back-button (‹) no longer rewinds out of /network when you arrived from a parent route. The focus chain is now encoded in the URL (?focus=A,B,C) instead of relying on browser history, so back always stays on the page.

v0.11.2

  • UINetwork graph: redesigned the node detail panel — smaller floating card on the right (280px) that doesn't block the map or overlap the toolbar. CCN nodes now show meaningful content (score, attached CRNs, stakers, total staked, owner, reward) instead of an empty card. CRN cards are trimmed to the graph-relevant facts (parent CCN, VM count, CPU/Memory bars, owner) with a 'View full details →' link to the full /nodes report. Stakers and reward addresses get a neat address card with a 'Connected to N CCNs' summary.
  • UIFocus on a node from inside the panel now keeps the panel open instead of closing it — clicking a CRN's parent-CCN link rebinds the panel to the parent in one motion. A compact 'Focused: <name> ×' pill inside the panel (or in the toolbar when the panel is closed) shows where you are; the leading caret steps back one focus layer, the × clears focus entirely.
  • UIStakers layer is now on by default so the stake graph reads on first paint without hunting for the toggle.
  • FixInitial map load and reset-view no longer flash anchored to the left before sliding to the center — the SVG viewBox now centers the world origin natively, and the simulation no longer relies on an alpha-independent center force that shoved nodes on the first tick.
  • InfraNetwork entry temporarily hidden from the sidebar pending review; the page is still reachable directly at /network.

v0.11.1

  • UINetwork graph visibility pass: nodes are bigger and zoom-adaptive — they boost up to ~1.9× when you're zoomed out so dots stay readable on the dark background, and ease back down when you zoom into dense clusters. Structural edges are brighter (60% opacity) and the same-owner overlay now matches their neutral gray instead of fighting them with a saturated blue, so the dashed pattern reads as annotation rather than competing topology.
  • UIStructural CCN→CRN edges now end in an arrowhead so direction reads at a glance. The arrow inherits whatever color the line has — neutral by default, the kind color when an incident edge is selected — and lands just outside the CRN border instead of being hidden under the node body.
  • FeatureSelecting a node now spotlights its 1-hop neighborhood: the selected node and its direct neighbors stay at full strength, and everything else (nodes, edges, and labels) dims to 18% opacity so the focused subgraph reads as a clean spotlight while peripheral context stays visible.
  • FixReset-view (and the first map load) no longer expands outward from a tight spiral over several seconds before re-centering. The simulation now pre-converges synchronously before the first paint, so the camera fits the spread layout in one transition. The settle indicator is correspondingly tighter (500ms instead of 2.2s).

v0.11.0

  • FeatureNew /network page renders the Aleph network as a force-directed graph — CCNs and their child CRNs, with optional same-owner, stake, and reward-cluster overlays. Long-press a node to drag it (the node stays in your hand instead of teleporting to the cursor); short-click to open its detail panel. Selected node's connecting edges are recolored to its kind color (CCNs purple, CRNs green) so neighbors are easy to spot. Address deep-link via ?address=0x… highlights every node owned by that wallet. Focus on a node to see its ego subgraph; layer toggles, focus, search, and selection all persist via URL params so any view is shareable.
  • UINetwork map fills the entire content area edge-to-edge — the page header, layer toggles, search, and focus banner overlay on top of the graph instead of stacking above it. Edges no longer bleed through nodes (each node renders an opaque background underlay before its translucent fill). Dotted/dashed edges are thinner with rounded caps so reward-cluster links read as round dots rather than tiny rectangles. CCN outer ring tightened so it sits closer to the node circle. Cursor stays as the default arrow everywhere — no hand variants on hover or drag.
  • FixBackground data refetches no longer reset the viewport — the auto-fit only fires when you change layers, focus, or address (the URL-driven things), not when polling lands new data. Drag now works on first map load, every time: drag attachment is delegated to the parent group via d3-drag's container + subject pattern, so it doesn't depend on whether individual node elements were in the DOM at the moment the effect ran. Post-drag settling cools down to rest in ~0.4s instead of 2–3s of wobble.
  • UINetwork graph polish pass: selected nodes show a translucent halo in their own color (no more pulsing purple ring on green CRNs); CCN/CRN names render as DS Badge chips with kind-mapped variants (CCN purple, CRN green, unreachable red, inactive grey) so kind reads at a glance. Same-owner / staker / reward overlay cliques no longer crush together (force-link strength reverted to d3's degree-aware default). Initial fit and reset-view show the full network with breathing room instead of zooming in tight.

v0.10.0

  • FeatureOverview hero now shows a world map of every Aleph Cloud node, sampled and clustered by country so the geographic story reads at a glance. Each green dot represents real nodes from the network — small countries (Russia, Italy, Canada, Sweden) always get at least one dot; heavy clusters like France and the US get proportionally more. Geolocation runs at build time: the build resolves CCN multiaddrs and CRN hostnames to country codes via ip3country and bakes them into a JSON snapshot, so the page stays a fast static export with no per-visitor lookups. If the upstream is unreachable or shrinks unexpectedly, the build keeps the previous snapshot — production never ships an empty map.
  • UIOverview hero restructured into a 2-column layout (stacks below lg): a 2×2 stat grid (Nodes Total/Healthy + VMs Total/Dispatched) on the left, the world map on the right. Dropped Unreachable, Removed, Missing, and Unschedulable from the hero — the operational long-tail is one click away on /nodes and /vms via the per-status pills, and dropping it gave the geographic story room to breathe. Card chrome (dot-pattern background + soft inner vignette) is theme-aware, so the worldmap reads naturally in both light and dark mode.

v0.9.1

  • FixCredits page now defaults to the 24h range, matching the Wallet page's Credit Rewards (24h) section. Searching the recipient table by node name and clicking through to the wallet view used to show two unrelated numbers — one over 7 days, one over 24 hours. They now agree by default. Users who want 7d/30d still pick it from the Tabs; the URL persists the choice via ?range=. Bonus: the credits query is ~7x smaller on first load, and the sidebar prefetch now shares its cache entry with the wallet page.

v0.9.0

  • FeatureVMs page now shows only active VMs by default — dispatched, duplicated, misplaced, missing, and unschedulable. The All-tab count drops from ~7,900 to the active baseline (matching the Overview Total VMs headline) so the operational signal isn't drowned out by long-tail noise (unscheduled, orphaned, unknown VMs). Toggle via the new "Show inactive VMs" checkbox in the FilterPanel — Payment & Allocation column. Clicking a specific status pill (e.g. Unknown from the overflow dropdown) bypasses the filter and shows that status's full count. Shareable via the ?showInactive=true URL parameter.
  • UIVMs page status tabs now show only All, Dispatched, and Scheduled — the remaining 7 statuses live in the `⋯` overflow dropdown, in priority order (Duplicated, Misplaced, Missing, Orphaned, Unschedulable, Unscheduled, Unknown). Reduces visual noise without hiding access to any status.

v0.8.8

  • FeatureCredits recipient search now matches node names. Typing a node name finds reward addresses that own a matching node, with a Matched: <full-name> chip in the Sources cell for each match — full names, no truncation, so you can scan rows and pick the right one without clicking through. Whole row is clickable and opens the wallet view, where the full per-node reward breakdown lives. The search query persists in the URL as ?q=, so navigating back from the wallet view restores your filter.

v0.8.7

  • FixOverview Total VMs card now counts only currently-active VMs (dispatched + duplicated + misplaced + missing + unschedulable) instead of every VM the scheduler has ever seen. The headline number now matches the sum of the visible status cards, and the subtitle reflects the active-status meaning. The full all-time list remains reachable via the All tab on /vms.

v0.8.6

  • FixOverview stat cards: on narrow viewports the Unreachable and Removed node cards no longer fall under the Virtual Machines header — Nodes and VMs now render as two independent grids that stack on mobile and sit side-by-side on desktop.

v0.8.5

  • UICredit recipient table now leads with Address and replaces the Roles column with a Sources column showing per-address chips like CRN: 2, CCN: 1, Staker — drawn from the corechannel registry per reward address. The Node column (which only ever showed one of an operator's nodes) is gone; click the address to see the full per-node breakdown on the wallet view.

v0.8.4

  • FixSorting Nodes/VMs/Issues/Credits tables by VMs, Memory, vCPUs, etc. now applies to the full filtered dataset — clicking a column header reorders rows across all pages instead of only the visible 25.
  • UIVMs filter Memory range now reads in GB instead of MB ("0 GB–256 GB" rather than "0 MB–262144 MB").

v0.8.3

  • FixRange slider extents (vCPUs, memory, VM count) now derive from the loaded fleet — nodes and VMs above the previous 128 vCPU / 512 GB / 32 vCPU / 65536 MB caps are no longer hidden when the slider is used.

v0.8.2

  • FixCredits-page refresh crash: only persist queries with status='success' (skip in-flight pending queries whose dehydrated state included a serialized promise that rehydrated as an empty object), drop node-state from the persisted whitelist (Maps don't survive JSON), defensive Array.isArray guard in sparkline. Version bump also busts existing bad cache entries.

v0.8.1

  • FixCredits page perceived load time: persisted cache (24h), prefetch on sidebar hover, keep previous range while switching, greyed flow-diagram placeholder while data loads

v0.8.0

  • FeatureCumulative revenue sparkline in the Total Revenue card on the credits page

v0.7.0

  • UIThree-tier typography: Source Code Pro for technical data, staggered card entrance on overview
  • FeatureNetwork Health page: status badge, glassmorphism stat cards, side-by-side endpoint sections
  • UIPage titles added to Nodes, VMs, and Network Health pages
  • UICredits page: powered-by Aleph Cloud watermark below flow diagram
  • UIFavicon and SEO images updated to DS Aleph Cloud logo mark
  • FeatureSortable Last Updated column on VMs table
  • UIOverview activity cards (Top Nodes, Latest VMs) link to detail view instead of list page
  • FixVM type filter: microvm → micro_vm to match API wire format
  • FixLatest VMs card: limit api2 lookups to 100 candidates, show dash when no creation time

v0.6.0

  • FeatureExpanded VM statuses: dispatched, duplicated, misplaced join the existing set for precise observation-based tracking
  • UIVM filter tabs priority-ordered (operational statuses first), default changed from Scheduled to All
  • UIOverview page: Dispatched hero card replaces Orphaned, showing healthy VM baseline
  • FeatureIssues page tracks 5 discrepancy types (added duplicated and misplaced) with Node perspective columns and filters

v0.5.0

  • FeatureCredits page with flow diagram, recipient table, and distribution breakdown
  • FeatureWallet view with owned nodes, VMs, credit rewards, activity timeline, and permissions
  • FeatureIssues page for scheduling discrepancy investigation (VM and Node perspectives)
  • FeatureAPI status page with Scheduler and Aleph API health checks, response latency, auto-refresh
  • RefactorIssues demoted to sidebar overflow menu to reduce noise for regular users
  • UICredit flow diagram polish: pre-populated particles, single origin points, removed arrowheads
  • UILight/dark mode theming fixes, filter panel UX improvements

v0.4.0

  • FeatureClient-side table pagination with page-size dropdown (25/50/100)
  • FeatureClickable overview stat cards linking to filtered list pages
  • FeatureAnimated donut rings with status icons on stat cards
  • UIStatus filter tabs switched to DS Tabs underline variant with overflow collapse
  • UIBadge, CopyableText, and status tooltip consistency pass

v0.3.0

  • FeatureGPU info on nodes and VMs (badges, filters, detail views)
  • FeatureCPU info on nodes (vendor filter, architecture column, detail sections)
  • FeatureConfidential computing indicators (ShieldCheck icon, filters)
  • FeatureAdvanced filters on list pages: search, checkboxes, range sliders, collapsible panel
  • InfraAutomated IPFS deployment via GitHub Actions with delegated billing
  • InfraPaginated API v1 support with parallel page fetching

v0.2.0

  • FeatureDedicated detail views for nodes and VMs via ?view= search params
  • FeatureTop Nodes and Latest VMs cards on overview page
  • FeatureOverview page redesign with glassmorphism stat cards, noise texture, accent glow
  • UIRecessed content panel, sticky detail panels, glass card styling
  • InfraReal API integration replacing mock data layer

v0.1.0

  • FeatureInitial dashboard with nodes and VMs tables, overview stats, dark theme
  • FeatureApp shell with sidebar navigation, responsive mobile drawer
  • FeatureCross-page navigation via URL search params
  • InfraStatic export for IPFS hosting with trailingSlash