Changelog
All notable changes to Azure Local Surveyor are documented here. Format follows Keep a Changelog.
[Unreleased]
[2.9.0] — 2026-10-15
Added
- Single node (1 machine): two-way mirror only, no storage cache, HDD rejected, no N+1. The node range is 1 to 16 and every message says 16 is the maximum; disaggregated SAN deployments (up to 64) are out of scope and the UI says so (AB#9075).
- Rack aware clusters 1+1 (two-way mirror, 50%) and 2+2 to 4+4 (four-way mirror, 25%): zone validation, all-flash rule, rack-loss compute check, and four-way volumes in capacity, fit, health check, hardware form, volumes and scripts.
- Drive and cache rules from Microsoft Learn (2 capacity drives minimum; cache needs 2 cache and 4 capacity drives; hybrid 15% ratio, 32 GB cache devices and multiple-of-cache rule; all-HDD without cache rejected) and the Learn all-flash and hybrid dual-parity efficiency tables.
- Facts registry (
src/engine/facts.ts): every encoded Azure Local fact with its Learn URL and verified date, shown on the References page, plus a list of planning assumptions that are not Microsoft requirements. A release banner shows Azure Local 12.2609 (latest) in the app, PDF, Markdown and plan JSON (targetRelease). - Built vs sized page and
docs/guide/as-built-fit.md: paste an as-built hardware JSON and compare it with sized demand and N+1 headroom. - JSON Schemas for the project and plan files in
docs/reference, validated by tests. ProjectstateVersionis 11; version 10 files still open and the new fields are additive. - Screen guide, RVTools import guide, single node and rack aware guide, privacy and data page, and a privacy guard test that fails if network APIs or remote assets are added.
- Journey navigation on every Storage Sizing and Workload Planning page: a step bar ("Step n of m", current step highlighted, completed steps ticked, clickable) above the page and a Previous / Continue footer below it. Workload order: Hardware → Workloads → Specialized Workloads (AVD, AKS, SOFS, MABS as sub-steps) → Hardware Options → Fit (Storage Design and Compare Drive Layouts as sub-steps) → Reports → Projects. Storage order: Hardware & Drives → Volume Planning → Compare Drive Layouts → Capacity & Resiliency → Storage Report → Projects. Routes and URLs are unchanged; the home, help and about pages show no bar.
Changed
- Minimum node count is 1 (was 2); fit, recommendations and hardware limits use 1 to 16. Dual parity efficiency follows the matching Learn table. Reports show Azure Local 12.2609 (latest) as the planning basis.
- Resiliency and volume pickers follow node count and rack aware mode. HDD capacity without a cache tier is now an error because Azure Local does not support it. Planning assumptions (host memory and vCPU reserve, N+1/N+2) are labelled as such.
- Documentation: README, repo intent, engine spec and AGENTS.md refreshed; the docs changelog page now includes this file instead of duplicating it; the Excel workbook path no longer names a drive letter; the 2.0 planning transcript moved to
archive/.
Security
- xlsx 0.18.5 (prototype pollution and ReDoS advisories, no npm fix) replaced by the SheetJS 0.20.3 vendor tarball with its integrity hash pinned in package-lock.json; jsPDF 4.2.1 and jspdf-autotable 5.0.9.
npm audit --omit=devwent from 8 findings (1 critical, 2 high, 5 moderate) to 2 moderate (react-router 6, which needs a major upgrade). Development-tool advisories (vitest, vite, eslint plugins) remain. - Removed the stale pnpm lockfile and workspace file; package-lock.json is the single lockfile.
Fixed
- vCLS agent VMs named
vCLS (n)are skipped by the individual RVTools import, and the grouped importer now skips vCLS too. - The README no longer claims a Share button: no screen uses the URL serializer in this version (see docs/reference/privacy-and-data.md).
[2.8.0] — 2026-09-10
Added
- Separate Storage Sizing and Workload Planning areas with independent browser state, project names, saves and resets (AB#9075).
- Workload paths for buying hardware and assessing existing equipment; OEM configuration comparison with node constraints, additional headroom and vendor filters.
- Existing-hardware headroom estimator for an additional VM profile; inventory VMs that exceed one host's usable RAM now fail fit checks.
- Standalone storage PDF, XLSX, Markdown and project exports; explicit reviewed transfers of hardware and storage designs between planning areas.
- Persistent project controls, stable specialized-workload navigation, and centralized Help & Reference with a new planning guide.
- Release version displayed consistently in the website and saved projects; published documentation and browser tests cover both planning areas.
- Refreshed 21 OEM planning presets with current Dell, HPE, Lenovo and DataON models, vendor references, review dates and visible sizing assumptions. Corrected stale tiers and removed unverified configurations (AB#9074).
- Sidebar link to Hyper-V Surveyor for Windows Server planning.
- Individual VM inventory with RVTools workbook/CSV import preview, editable rows, inclusion controls, tier review, search, and bulk changes.
- Optional measured P95 CPU/memory sizing, performance templates and imports, independent allocation fallbacks, evidence coverage, inventory growth, and consumed/provisioned storage selection.
- Workload Fit page with maintenance reserves, CPU/RAM/pool deficits, per-volume resiliency, and same-spec node comparison within the existing 2–16 node S2D model.
- Downloadable, versioned projects with restore preview and scenario comparison; older plan manifests remain readable.
- Inventory totals and fit assumptions in reports and exports, with detailed inventory in Markdown/XLSX and complete evidence in JSON projects.
- Workload-first, existing-hardware, and fit-assessment entry points.
Fixed
- Unified workload totals across screens and exports, including custom-workload internal mirrors and avoiding duplicate compute for services already hosted by AKS workers.
- Workload-page utilization now includes inventory, custom workloads, and service presets and respects the selected maintenance reserve.
- Inventory storage converts binary GiB to decimal TB once before entering the storage-capacity model.
[2.7.0] — 2026-06-30
Added
- RVTools import (AB#414) — seed the Workload Planner from an existing VMware estate. The new Import RVTools button accepts a full RVTools
.xlsxexport or thevInfotab saved as.csv, parses thevInfosheet, and creates custom workloads. VMs are grouped by their (vCPU, memory) signature — each distinct spec becomes one workload withvmCountset to the matching-VM count, so a fleet of identical hosts collapses into a single row while group totals stay exact. Memory is read fromMemory(MiB → GB); storage fromProvisioned(falling back toIn Use) is summed per group into logical storage (MiB → TB), withosDiskPerVmGB = 0so storage is never double-counted andinternalMirrorFactor = 1(the provisioned figure is a single allocation). Template VMs are skipped; powered-off VMs are included and surfaced in an import summary alongside VM count, group count, and aggregate vCPU/RAM/storage. Reuses the bundledxlsxdependency (no new packages). Robust to RVTools quirks:MB-labelled columns are treated as MiB, thousands separators in CSV cells are tolerated, and malformed or non-vInfo files produce a clear error.
[2.6.0] — 2026-06-30
Changed
- Provisioning-aware 70% headroom guidance —
HC_HIGH_UTILIZATIONhealth check is now provisioning-aware. When utilization exceeds 70% and thin-provisioned volumes are present, the issue remains severitywarning(a full pool takes thin volumes offline). When all volumes are fixed/thick, it downgrades toinfo— fixed volumes commit their footprint up front, so the binding constraint is that footprints fit the pool (enforced byHC_OVER_CAPACITY). Messaging throughout (health check, docs page, best-practice notes) now frames 70% as a recommended operational headroom convention rather than a Microsoft hard limit.
Added
"Size to enter" column in Expansion Headroom tables — surfaces the exact TB value to type into
New-Volume -Sizeor Windows Admin Center. PowerShell and WAC read size suffixes as binary (1 TB = 1 TiB), so this equals the TiB column, rounded down to 2 decimal places so the new volume always fits. Appears in the Final Report table, Markdown export, and XLSX export. Column header: "Size to enter / New-Volume / WAC". Past-line rows show "—". Matches the identical column being added to Cartographer 1.9.0 for cross-tool consistency.WAF N+1/N+2 re-framed as compute resiliency — corrected behavior: per Microsoft WAF, N+1/N+2 reserves CPU and memory so nodes can be drained for updates or survive a node loss without dropping VMs. It is a compute concept and does not reduce storage capacity. The 2.5.0 storage-pool deduction has been removed;
availableForVolumesTBis now invariant tomaintenanceReserveMode. The control is relabeled "WAF compute resiliency target" in Advanced Settings. The Compute Report now shows N+1 and N+2 headroom rows for both vCPU and memory, with the selected target highlighted. N+2 compute fields (usableVCpusN2,usableMemoryGBN2) are exported in Markdown and XLSX.
[2.5.0] — 2026-06-30
Added
- Maintenance reserve (N+1 / N+2) — an optional Advanced Setting (default None / off). When enabled it reserves one (N+1) or two (N+2) nodes' worth of raw capacity — the headroom Microsoft's Well-Architected guidance recommends so a node can be drained for updates — as a deduction in the capacity model. Available-for-volumes and the Expansion Headroom table recompute against the reduced number. It is additive to the rebuild reserve. Off by default, so existing plans are unchanged; on a two-node two-way mirror each node already holds a full copy, so this is conservative operating headroom, not data-loss protection (explained in the setting's help text).
[2.4.1] — 2026-06-30
Added
- Expansion Headroom report section — at 70% / 80% / 90% / 100% pool-fill targets, shows the remaining pool footprint and the new usable data you can still store (footprint ÷ resiliency copies), in both TB and TiB, with a chart. The 70% row is flagged as the recommended planning line. Math is identical to Cartographer's, so the two tools reconcile by construction.
Removed
- Dead
capacityEfficiencyFactor(0.92) Advanced Setting. It was approximately the TB→TiB unit constant (0.90949) mislabeled as an efficiency haircut, and the engine already ignored it (uses a ~1% pool-metadata factor). Removing it prevents it from ever being re-applied as a phantom deduction. Capacity numbers are unchanged. Older saved scenarios import cleanly (the field is ignored on load).
[2.4.0] — 2026-06-30
Wave 3 — Validation & report correctness. Locks accuracy so it can't regress: a shared golden-cluster fixture proves Surveyor and Cartographer reconcile by construction, and the Custom Workloads import path gains full lifecycle coverage.
Added
- Cross-tool reconciliation keystone. A byte-valued golden-cluster fixture (
src/engine/__tests__/fixtures/golden-clusters.json) is checked into both Surveyor and Cartographer identically; each tool runs its own engine against it, so green-on-both proves the two reconcile within the ±2% Wave 1 gate. 28 vitest cases across 4 clusters (twoway / threeway / dualparity, SSD and HDD). (AB#4633) - Full Custom Workloads JSON import lifecycle test coverage — parse, validate, normalize, round-trip, and template shape. 46 new vitest cases. (AB#154)
Changed
- Custom Workloads import parsing/validation/normalization extracted from
CustomWorkloads.tsxinto a pure, exportedparseCustomWorkloadsJsonin the engine (no behavior change), making the import path unit-testable. (AB#154)
[2.3.0] — 2026-06-29
Wave 2 — Legibility. The numbers are now correct (2.2.0); this release makes them unambiguous. No capacity math changed.
Added
- Every capacity figure is now labeled with both its unit (decimal TB and binary TiB) and its space (footprint vs usable data); available-for-volumes shows e.g. "22.23 TB / 20.21 TiB". Glossary gains a "Footprint vs Usable" entry. (AB#4640)
- 70% planning line drawn on the capacity bar and volume utilization bar, with an amber alert when planned volume footprint exceeds 70% of available-for-volumes (matches Cartographer's definition exactly). (AB#4639)
- Two-way / three-way resiliency toggle in the Suggested Volumes panel; suggested sizes recompute from the pool target and options are gated by node count. (AB#4637)
[2.2.0] — 2026-06-29
Wave 1 — Capacity accuracy. Capacity figures are reconciled to the canonical model (
docs/capacity-model.md) shared with S2D Cartographer. Computed usable/available figures rise ~8% versus 2.1.x because the prior model was undercounting — see Changed below.
Changed
- Capacity engine reconciled to the canonical model. The previous single
0.92per-drive factor — which silently conflated a real metadata overhead with the TB→TiB decimal/binary conversion — is decomposed into an explicit ~1% pool metadata overhead (decimal TB) plus a single TB→TiB conversion applied once at available-for-volumes. Usable/available figures increase ~8% relative to 2.1.x. (AB#4641) - Reserve capacity now computed on a raw-byte basis —
min(nodes, 4) × largest raw drive— instead of an efficiency-adjusted value, matching Cartographer. (AB#4643)
Added
- Resiliency gating: resiliency options invalid for the current node count are disabled (no Three-Way Mirror on a 2-node cluster); 2-node clusters advise Nested Two-Way. Engine exposes
clampResiliency()/validResiliencyOptions(). (AB#4636)
Fixed
- "Total usable" capacity is no longer mislabeled as a per-node "× nodes" figure. (AB#4635)
[2.1.4] — 2026-04-15
Features
- Best Practice Volume Reference table now shows four pool utilization bands (70 / 80 / 90 / 100%) for both Three-Way Mirror and Two-Way Mirror, allowing direct comparison of the space/headroom tradeoff (#156)
- Suggested Volumes section adds a 70 / 80 / 90 / 100% pool utilization target selector; defaults to 70% to avoid triggering the WAC rebuild-headroom health alert; changing the band resets the added-volume state (#156)
- PowerShell quick-create script follows the selected reference band (default 70%) via a segmented button selector on the PS block (#156)
[2.1.3] — 2026-04-15
Bug Fixes
- Generic Hardware-Based volume suggestions round DOWN per-volume size to prevent pool footprint from exceeding available pool on add (#154)
[2.1.2] — 2026-04-15
Bug Fixes
- About page links corrected — Surveyor Docs link now points to the in-app docs route and S2DCartographer link points to the documentation site (#153)
[2.1.1] — 2026-04-15
Bug Fixes
- SOFS host volume suggestions now combine the guest VM OS disk and guest data on the same Azure Local host volume in both
sharedandper-vmlayouts (#152)
[2.1.0] — 2026-04-15
Bug Fixes
- Pool utilization bar shows 100–101% and turns red when all storage is committed to valid volumes — off-by-one in utilization percentage calculation (#146)
- HC_HIGH_UTILIZATION warning message conflates the reserve-drive concept with the 70% raw-capacity utilization reserve — rewrite needed for clarity (#147)
- SOFS Auto-Sizing has a duplicate node count input that should instead be read from the Hardware page (#149)
- AVD-Profiles and AVD-OfficeContainers volume suggestions are incorrectly generated when SOFS is selected as the profile store (#151)
Enhancements
- Capacity Report: display Two-Way Mirror and Three-Way Mirror efficiency percentages side by side so hardware configurations can be compared on a single screen (#145)
- MABS: add a toggle to choose whether the MABS VM OS disk gets a dedicated volume placement or is folded into the MABS metadata volume (#150)
Research
- ReFS Deduplication and Compression: investigate capacity-planning impact, quantify realistic savings rates, and document caveats for Surveyor guidance (#141)
[2.0.0] — Comprehensive Quality Overhaul (Epic #122)
This release delivers a full-stack v2.0 overhaul across 14 phases. Every workload planner now generates structured volume suggestions, per-volume resiliency and provisioning are independently configurable, and a Reports page with conditional tabs shows a detailed solution summary for each enabled workload.
Added
- AKS Multi-Cluster (#105): plan multiple independent AKS clusters; each cluster generates its own OS-disk CSV and PVC volume suggestions;
computeAks()aggregates across all clusters - VM Storage Groups (#106): organize virtual machines into named storage groups; one volume suggestion per group; groups replace flat VM scenario inputs from v1
- SOFS Volume Layout (#108):
sharedmode generates 1 data + 1 OS-disk volume;per-vmmode generates N data + N OS-disk volumes (one pair per SOFS guest VM); layout stored insofsInputs.volumeLayout - Per-Volume Resiliency (#100): each
VolumeSpeccarries its ownresiliencytype; pool footprint calculation uses the per-volume factor, not the global default - Per-Volume Provisioning (#101): each
VolumeSpeccarriesprovisioning: 'fixed' | 'thin'; health check enforces fixed-only capacity constraint (HC_OVER_CAPACITY); thin over-provisioning fires HC_THIN_OVER_PROVISIONED as info only - Quick Start Reference (#75, Phase 12 rewrite): hardware-only two-row reference (three-way-mirror + two-way-mirror); 1 GiB safety margin applied after TiB floor; NO FAIL status; PowerShell
New-Volumesnippet auto-generated - Compute Health Check (#132, Phase 13):
runComputeHealthCheck()emits HC_VCPU_HIGH, HC_VCPU_OVER_SUBSCRIBED, HC_MEMORY_HIGH, HC_MEMORY_EXCEEDED; displayed in a dedicated Compute section on the Reports page - AVD Report Tab (#133): per-pool session host breakdown, FSLogix storage per pool, OS disk sizes, office container totals
- AKS Report Tab (#134): per-cluster control-plane and worker node breakdown with resource totals
- MABS Report Tab (#135): backup sizing, internal mirror impact, VM specs, volume suggestions table
- SOFS Report Tab (Phase 13 update): guest cluster sizing, IOPS at steady-state and login storm, internal mirror compounding explanation
- Arc → AKS Integration (#103, Phase 6): Arc-enabled service preset storage folds into
AKS-ArcServices-PVCwhen AKS is enabled; standaloneSvc-*volume generated when AKS is off - Custom Workloads (#107):
internalMirrorFactorapplied to data volume size; OS disk volume ({Name}-OsDisk) generated whenosDiskPerVmGB > 0; disabled workloads excluded from totals and volumes - Store Migration v9 (#130):
migratePersistedState()exported for direct testing; v8 → v9 wraps flat AKS → clusters array, flat VMs → groups array, converts AVDprofileStorageLocation: 's2d'→'sofs', addsprovisioning: 'fixed'to existing volumes, adds SOFS v2.0 defaults, removes per-workload CSV-resiliency fields - Test Coverage (Phase 14, #139): 115 automated tests (up from 63); new tests cover AKS multi-cluster, VM storage groups, SOFS per-vm layout (2 and 3 VMs), Quick Start rounding, per-volume mixed resiliency pool footprint, Arc → AKS integration, custom workload mirror factor and OS disk generation, health check mixed fixed+thin, store migration v2→v9
Changed
VolumeSpec: addedprovisioning: 'fixed' | 'thin'(required); existing volumes migrated tofixedin v9SofsInputs: addedvolumeLayout: 'shared' | 'per-vm'andsofsOsDiskPerVmGB: number; both defaulted in v9 migrationAksInputs.clusters: flat AKS inputs replaced byclusters: AksCluster[]array in v9 (breaking schema, migration provided)VmScenario.groups: flat VM inputs replaced bygroups: VmStorageGroup[]array in v9 (breaking schema, migration provided)MabsInputs: removedscratchResiliency/backupResiliency(v9); resiliency now per-volume on Volumes page- Health check: split into volume health check (
runHealthCheck) and compute health check (runComputeHealthCheck) — compute codes (HC_VCPU_, HC_MEMORY_) no longer emitted by volume HC
Removed
hardware.volumeProvisioningfield removed in v9 (now per-volume viaVolumeSpec.provisioning)customWorkloads[].resiliencyfield removed in v9 (now per-volume on Volumes page)
[1.7.0] — Architecture Documentation
Added
- Architecture docs: new
docs/architecture/overview.md— app layer diagram (Mermaid), page-to-engine map, state structure, export layer table, OEM preset overview (#90) - Architecture docs: new
docs/architecture/engine-flow.md— end-to-end pipeline flowchart (Mermaid), capacity computation chain, workload aggregation flow, health-check evaluation diagram, volume suggestion flow, override handling table, Advanced Settings impact reference (#90) - Formula map:
deferredandimplemented-with-enhancementsstatuses added to the status key; AVD/SOFS/Compute parity test counts populated (12/8/6 scenarios); app-added modules table (AKS, MABS, service presets, custom workloads, json.ts, powershell.ts, avd-pools.ts, workload-volumes.ts); links to architecture docs (#90, #118) - Engine spec:
surveyorVersionupdated to1.7.0; Final Report entry updated toimplemented-with-enhancementswith all five exporters listed;implemented-with-enhancementsstatus added tostatusValues(#118)
Architecture notes
- Plan manifest (
SurveyorPlanJSON export) and its Ranger integration contract are fully documented indocs/reference/plan-manifest.md(#118) - Workbook coverage artifact (
engine-spec.json) and formula map (docs/reference/formula-map.md) serve as the machine-readable and human-readable lineage references respectively (#118)
[1.6.0] — AKS Dependencies, Terminology Clarity
Added
- Navigation: subtitle labels added under each workload nav item — "Virtual Machines", "Azure Virtual Desktop", "Kubernetes", "Scale-Out File Server", "Azure Backup Server" (#120)
- Arc-enabled service presets:
requiresAksflag on all 5 catalog entries (SQL MI GP/BC, IoT Operations, AI Foundry Local, Container Apps); Workload Planner shows amber dependency banner with one-click Enable AKS when any such preset is enabled and AKS is off (#103) - AKS disable-protection: confirmation dialog when user tries to disable AKS while an AKS-dependent preset is enabled (#103)
- PDF export: full SOFS Solution Report section added (12-row parameter table covering users, storage footprint, VM sizing, IOPS, CSV capacity, and resiliency compounding warning) (#115)
- Docs: new
docs/engine/aks.mdcovering AKS engine inputs, computation, storage resiliency field scope, Arc-enabled service dependency model, and integration points (#103)
Changed
- Navigation: AKS moved before SOFS in the sidebar (order: Workloads → AVD → AKS → SOFS → MABS) (#120)
- AVD: "Host Pools" planning concept renamed to Session Host Groups throughout UI, exports (Markdown, XLSX), and page copy — distinguishes session hosts on Azure Local from the host pool resource in Azure (#121)
[1.5.0] — AVD Maturity
Commits:
8e190af
Added
- AVD planner: multi-pool host pool support — plan up to 10 independent AVD host pools in a single session, each with its own name, user count, workload model, session type, and profile storage location (#111)
- AVD planner: per-pool breakdown table shown when more than one pool is configured; aggregate totals always shown at the top (#111)
- AVD planner: pool selector card rail with add/remove controls; selecting a pool shows its detailed density analysis and bandwidth estimate (#111)
- AVD planner: SOFS sync panel now aggregates across all SOFS-targeted pools only; shows aggregate user count, concurrent users, and profile size driving SOFS demand (#111, #112)
- SOFS planner: reciprocal sync values now reflect SOFS-targeted pool aggregates rather than total AVD demand (#111)
- AVD ↔ SOFS cross-page navigation: "Open the SOFS planner" link in the AVD sync panel; "Open the AVD planner" link in the SOFS sync indicator (#112)
- Markdown export: per-pool breakdown table included when more than one pool is configured; external storage total shown when any pool uses non-SOFS storage (#111)
- XLSX export: AVD Planning sheet includes aggregate summary rows followed by per-pool detail sections (#111)
- Engine docs:
docs/engine/avd.mdanddocs/engine/sofs.mdupdated to document multi-pool architecture and SOFS-targeted aggregation
Changed
- AVD planner page copy: removed single-pool caveat; explains native multi-pool planning support
- SOFS planner page copy: clarifies that only SOFS-targeted AVD pools are counted toward linked AVD demand
- Zustand store: bumped to version 8; migration converts legacy flat AVD state into the new
pools[]array format
Fixed
- Store migration:
omitUndefined()guard added to prevent legacy persistedundefinedvalues from overwriting pool defaults during migration (#116)
[1.4.0] — Stability and UX Clarity
This release absorbs the unreleased v1.2.0 research and documentation work.
Added
- Landing page at the app root (
/) for first-run orientation, including a simple explanation of what Surveyor is, what the left-hand menu does, and where to start - Engine and docs coverage for changelog, plan manifest, and missing MkDocs navigation pages
Changed
- Hardware page moved to
/hardware; the sidebar logo/title and new Home nav item now return users to the landing page - AVD guidance now separates concurrent-user sizing from total-user profile storage sizing and documents RemoteApp planning assumptions
- Surveyor docs were audited, repaired, and cross-linked with S2DCartographer and related Azure Local references
[1.3.0] — Workload Intelligence
Commits:
1f3c0dc→974b73a
Added
- AKS planner:
aks.resiliencyis now wired into theAKS-PersistentVolumesvolume suggestion; previously defaulted to the global resiliency setting regardless of the per-cluster selection (#89) - AKS planner: scope note at top clarifying this page sizes base AKS infrastructure only — Arc-enabled service workloads are added separately as service presets (#89)
- Arc-enabled service presets: pre-built workload templates for Arc SQL MI (General Purpose), Arc SQL MI (Business Critical), Azure IoT Operations, Azure AI Foundry Local, and Azure Container Apps (#81)
- Service presets: per-instance configuration with optional vCPU, memory, and storage overrides; catalog defaults are preserved when overrides are cleared (#81)
- Service presets: all enabled instances roll up into Workload Planner aggregate totals, volume suggestions (using catalog
defaultPvcResiliency), FinalReport, and XLSX/Markdown exports (#81) - Custom workload builder: manual entry form for any workload not covered by built-in scenarios — VM count, vCPUs/VM, memory/VM, OS disk/VM, logical storage, resiliency, internal mirror compounding factor, and optional bandwidth estimate (#80)
- Custom workload builder: JSON import from file upload; downloadable JSON template for schema reference (#80)
- Custom workload builder: multiple workloads with independent enable/disable; internal mirror compounding generates accurate volume suggestion footprints (#80)
- Custom workloads: roll up into Workload Planner totals, volume suggestions, FinalReport, and XLSX/Markdown exports with a dedicated detail sheet (#80)
- Zustand persist: migrated to v6 (adds
customWorkloads); v5 addsservicePresets(#80, #81)
Changed
- AVD page: clarified single-pool scope note; added multi-pool approximation guidance; added RemoteApp mention (#95)
- AKS planner: renamed "Storage resiliency" → "Workload volume resiliency"; storage total row now shows separate OS-disk vs PVC resiliency sub-labels (#89)
[1.1.0] — Planner Features
Commits:
37e3660→b4c4796
Added
- SOFS planner: architecture context banner explaining the three layers — Azure Local host CSVs → SOFS guest VM cluster → FSLogix clients (#88)
- SOFS planner: "Azure Local host-side volume requirement" row in Sizing Results, explicitly showing the CSV space needed before host resiliency overhead (#88)
- SOFS Report tab in Reports — dedicated end-to-end SOFS solution summary (FSLogix demand, guest cluster design, host-side requirement, resiliency compounding, IOPS, deployment assumptions); tab is hidden when SOFS is disabled (#88)
- AVD ↔ SOFS sync panel: when AVD profile storage is set to SOFS, an "Apply to SOFS planner" button syncs user count, concurrent users, and profile size into SOFS state (#92)
- SOFS planner: reciprocal sync indicator — green when in sync with AVD, amber when values diverge (#92)
- AVD planner: burst headroom warning when concurrent users < 70% of total users (#96)
Changed
- SOFS planner: removed all internal issue numbers (
#41,#43,#45,#69) from user-facing labels and headings (#88) - SOFS planner: split inputs into two named sections — FSLogix Storage Demand and SOFS Guest Cluster Configuration (#88)
- SOFS planner: renamed "SOFS internal mirror type" → "Guest cluster data protection"; "SOFS Cluster Hardware Auto-Sizing" → "Guest Cluster Drive Sizing" with rewritten descriptions clarifying storage layers (#88)
- AVD planner: concurrent users field now has a persistent explanation that session hosts/compute/bandwidth use concurrent users while profile storage always uses total users (#96)
- AVD planner: profile storage row in Sizing Results has a sub-label making the total-users sizing explicit (#96)
- AVD planner: removed remaining internal issue numbers (
#26,#31,#33,#37,#39) from user-facing labels (#96)
[1.0.1] — Stability and UX Clarity
Commits:
75814ca→97f1db0
Added
- Version number displayed in sidebar and About page (#84)
- Changelog (
CHANGELOG.md) with full version history (#84) - About page with resource links, credits, and release history (#84)
- ErrorBoundary component — catches render errors and offers a one-click reset instead of a blank screen (#83)
- Reset All Settings button in Advanced Settings panel with two-step confirmation dialog (#82)
Fixed
- Blank screen on Volumes and AVD pages in Edge caused by stale Zustand localStorage state from older schema versions (#83)
normalizePersistedState()+mergecallback ensures all store fields are hydrated with defaults on load (#83)- Removed
dell-ax-670-large(not a real catalog entry); Dell AX presets now match the April 2026 solutions catalog (#87) - Pre-existing lint errors:
no-useless-escapein volumes.ts, unused variable in ReportsPage.tsx
Changed
- Lenovo MX: added V4 Premier Solutions (MX630 V4, MX650 V4); V3 models remain as Integrated Systems (#87)
- HPE ProLiant: DL380 Gen11 elevated to Premier (Ignite 2025); DL145 Gen11 added as Integrated System for edge (May 2025); DL360 Gen11 remains Validated Node (#87)
- AKS and VM workload resiliency fields renamed from generic "Resiliency" / "Storage resiliency" to "Workload volume resiliency" with context hints (#91)
- AVD scenario card now explains that OS disks use Three-Way Mirror and profile/data volumes follow the default resiliency in Advanced Settings (#91)
- Quick-Start Volumes fit-check banner renamed from "FIT CHECK: PASS/FAIL" to "Reference scenario fits/does not fit" (#98)
- Quick-Start footer now explicitly distinguishes the reference scenario from the Volume Health Check and explains they are independent (#98)
- Added Microsoft Learn reference links to the Quick-Start Volumes section (#98)
- Milestone structure reorganized: v1.0.1 (stability), v1.1.0 (polish), v1.2.0 (research/docs), v1.3.0 (intelligence) (#84)
[1.0.0] — Quick-Start Volumes and Report Alignment
Commit:
a8beb7c
Added
- Quick-start volumes table — hardware-based equal-split reference with fit check (#75)
- Volume mode toggle — switch between workload-based and generic hardware-based suggestions (#76)
- Smart volume mode with capacity validation (#76)
- Expanded volume health check — summary banner and collapsible detailed breakdown (#77)
- OEM preset dropdown verification and update against Azure Local hardware catalog (#78)
- Report alignment — unified exports, PowerShell scripts, and completeness pass (#79)
[0.4.0] — MABS, VM Scenarios, and Drive Layout
Commits:
b7f3fca→f3a833a
Added
- MABS (Microsoft Azure Backup Server) backup planner (#70)
- VM scenarios consolidation and workload-based volume suggestions (#68)
- Drive layout comparison page — auto-calculate equivalent drive size for same raw capacity (#65)
- NaN guards and internal mirror resiliency support (#67–#74)
- Drive size standardized dropdown replacing free-text input (#74)
- TiB labeling throughout volume and capacity output
- Hyperthreading locked as enabled on Hardware form; override moved to Advanced Settings
Fixed
- SOFS NaN values in planner output
[0.3.0] — Advanced Settings, Charts, and Exports
Commits:
75126b0→aab780e
Added
- Advanced settings overrides for formula-calculated values (#64)
- Visual charts and gauges in reports (#10)
- Richer PDF and XLSX exports matching Excel tab structure (#18)
- Health check expansion — logo and onboarding banner (#20, #19)
- Advanced Settings sidebar button wired to working modal (#2)
[0.2.0] — AVD, SOFS, AKS, Health Check, and Reference Pages
Commits:
fb82ffe→b0fb8b6
Added
- Azure Virtual Desktop (AVD) planner — session host density, FSLogix sizing, network bandwidth, gold image reference, readiness checklist (#26–#39)
- AVD FSLogix user type mix estimator — Task / Knowledge / Power Worker (#59)
- AVD FSLogix profile storage location selector (S2D / SOFS / Azure Files / External) (#33)
- Growth buffer percentage on FSLogix profile storage (#27)
- Concurrent users as primary session host sizing driver (#26)
- Scale-Out File Server (SOFS) planner — cluster sizing, IOPS, FSLogix container types, readiness checklist (#41–#47)
- AKS on Azure Local planning page (#17)
- Dell AX-660, AX-4510, AX-4520 OEM presets
- Tabbed Reports view — Capacity / Compute / Final (#9)
- N+1 failover analysis and N+1 Fit column in compute report (#23)
- Per-scenario vCPU overcommit ratios (#24)
- Overcommit sensitivity table with N+1 Fit column (#25)
- Thin Provisioning reference guide with risks, PowerShell monitoring, and checklist (#53)
- References page — 17 hyperlinked Microsoft Learn URLs (#55)
- TB ↔ TiB conversion reference table with live converter (#57)
- In-app Documentation page (#3)
- Resiliency reference guide (#11)
- Conditional sidebar navigation — hide AVD/SOFS when disabled (#4)
- Prominent TiB vs TB callouts throughout the UI (#5)
- Best Practice Notes section in Final Report (#51)
- PowerShell volume creation commands in Final Report (#49)
Fixed
- Pool utilization warning threshold corrected to 70% (#58)
- SOFS compute never added to workload totals (#15)
- Health check vCPU/memory checks ignoring workload scenario totals (#14)
- FinalReport always showing AVD/SOFS sections regardless of enabled state (#12)
[0.1.0] — Initial Release
Commits:
cba85d8→843056b
Added
- Hardware inputs — node count, CPU, memory, drive configuration, OEM presets
- S2D capacity engine — pool sizing, resiliency efficiency, usable capacity formula (Excel-parity rewrite)
- Capacity Report — raw capacity, pool capacity, usable capacity, WAC TiB equivalent
- Workload planner — multi-scenario vCPU and memory planning
- Basic volume planning
- Azure Local brand color scheme and hexagon logo
- Hash-based routing for GitHub Pages SPA support