The engine (or glue) that pollutes vSphere — and now Hyper-V — with brand-new servers, straight from install ISOs. No templates. No golden images. No "who touched the base image" meetings.
Describe the VMs, get a plan with a hash, build the unattended answer media, then apply it with a receipt for every step. When it breaks, and it will, you'll know exactly where.
Status (0.9.1, prerelease): planning, validation, answer-media ISOs, install-ISO checks, and the desktop app are proven offline on Windows. No VM has been built with this release yet. The vSphere and Hyper-V apply paths, and Windows Setup or Anaconda actually eating the generated media, have not been run. Optimism is not evidence. See docs/EVALUATION.md.
For the person who gets asked for "a few new servers by this afternoon" and is tired of clicking through Windows Setup, or of keeping golden images alive. You write down the VMs you want (names, sizes, network, OS) in one YAML, JSON or CSV file. Multi Install ISO checks it, turns it into a plan you can review, builds the unattended answer media that installs each server straight from the vendor's ISO (Windows Server, or Rocky/Alma/RHEL), and then creates the VMs on vSphere or local Hyper-V with a receipt for every step. It solves two problems: repeatable builds without templates, and knowing exactly what happened when one of them goes wrong.
- Get it. Download
MultiInstallIso-<version>-win-x64.zipfrom Releases and extract it, or build it yourself withbuild.cmd, which lands indist\MultiInstallIso-<version>-win-x64\. It needs Windows 10/11, PowerShell 7 and the WebView2 runtime; the .NET runtime is built in. - Start the app. Run
MultiInstallIso.exe. The Overview page shows what is planned and built, and the Dependencies page shows what is missing (PowerCLI for vSphere, the Hyper-V module for Hyper-V). - Describe the VMs. On Definition, open a bundled sample (they are read-only, so save a copy) or your own file, pick vSphere or Hyper-V, and fill in the target. Definitions never hold passwords.
- Plan. Click Plan. Fix anything it lists as blocking until the plan is clean, then note the plan's SHA-256 on the Plan page; every later step asks for it.
- Check the install ISOs. On Install ISOs, point at each vendor ISO with the publisher's SHA-256.
PASSmeans the hash matched and the content was recognised. - Build the answer media. On Answer media, enter the admin (and domain-join) credentials in the native dialog. You get one small verified ISO per VM. It holds credentials, so delete it once the servers are built.
- Apply. The Apply page shows a readiness checklist and the exact
Build-Cluster.ps1 -Mode Applycommand to run in a terminal, with the plan hash and the target you must name. It builds the VMs one at a time and stops at the first failure. - Review. Runs lists every plan, media build and apply attempt with its receipts.
Prefer the command line? Everything above is in Command line and step by step in docs/RUNBOOK.md.
You need four Windows servers by 5 PM: two IIS, two API. Patched, domain-joined, code pulled. The dev team is waiting to break them with horrible code, and your bonus is on the line.
You could click through Windows Setup four times. Or:
flowchart LR
A["Definition<br/>YAML / JSON / CSV"] --> B["Plan<br/>validate + SHA-256"]
B --> C["Answer media<br/>autounattend / ks.cfg ISO<br/>read back + hashed"]
I["Install ISO<br/>SHA-256 + edition check"] --> D
C --> D["Apply<br/>hash + target confirmed<br/>one VM at a time"]
D --> E["Receipts<br/>attempt, per VM, summary"]
- Plan. Reads your definition, tells you everything wrong with it (the old samples used a vSphere guest ID that doesn't exist — nobody noticed for years), and writes a read-only plan with a SHA-256.
- Answer media. One tiny ISO per VM with
autounattend.xml(Windows) orks.cfg(Rocky/Alma/RHEL). Built, read back byte-for-byte, hashed, and locked down because it holds passwords. - Apply. Creates the VMs one at a time, but only if you quote the plan hash and name the target out loud. Writes an attempt record before it touches anything and a receipt after every step. Stops at the first failure and doesn't "helpfully" delete anything.
dist\MultiInstallIso-<version>-win-x64\MultiInstallIso.exe (built by build.cmd), or grab the zip from Releases.
- Pages: Overview, Definition (edit and plan), Plan, Answer media, Install ISOs, Apply, Runs, Dependencies, Settings.
- Liquid Glass, because apparently everything is glass now. Settings for on/off, opacity, blur, and Reset. Goes solid on its own when Windows transparency is off, high contrast or forced colours are on, or blur isn't available.
- Native title bar. Tray icon with Show, Hide, Close to tray (on by default), and Exit. Launch it twice and you get the same window back, not two.
- The version button has the Glimmer orb. It thinks when the app is working, flashes when it's done, and turns red when something failed. More honest than most status pages.
- Credentials go into a native dialog and reach the engine on stdin. They never touch the web UI, a command line, or a log.
- Apply isn't run from the window yet. It hands you the exact command to run in a terminal, because the first real run deserves a human watching it.
MultiInstallIso.exe --smokeruns a self-check, including a real plan and answer-media build.--snapshot <png> [--glass on|off] [--view <page>]renders a page to an image.
The real app, captured on Windows 10. No mockups were harmed.
Glass on, glass off. For people who think translucency is a personality:
| Glass on | Glass off |
|---|---|
![]() |
![]() |
pwsh -File .\Build-Cluster.ps1 -DefinitionPath .\cluster-vms.yaml -PlanOnly
pwsh -File .\Build-Cluster.ps1 -Mode Media -PlanPath <plan> -PlanHash <sha256> -AdminCredential (Get-Credential Administrator)
pwsh -File .\Build-Cluster.ps1 -Mode VerifyMedia -PlanPath <plan>
pwsh -File .\Build-Cluster.ps1 -Mode InspectIso -IsoPath <iso> -ExpectedSha256 <sha256> -ImageName "Windows Server 2022 SERVERSTANDARD"
pwsh -File .\Build-Cluster.ps1 -Mode Apply -PlanPath <plan> -PlanHash <sha256> -ConfirmTarget <vcenter-or-computer>
pwsh -File .\Build-Cluster.ps1 -Mode DependenciesAdd -Json if a machine is reading. Exit codes: 0 fine, 1 your definition or media has a problem, 2 something actually broke. The full walkthrough is in docs/RUNBOOK.md.
| Path | Purpose |
|---|---|
Build-Cluster.ps1 |
Command-line entry point |
powershell\MultiInstallIso\ |
The engine: YAML reader, validation, plans, answer files, ISO writer/reader, media, apply, providers, dependency map |
guest\PostDeploy.ps1 |
Runs inside new Windows VMs at first logon (Windows PowerShell 5.1, because that's all a fresh server has) |
src\MultiInstallIso.App\ |
.NET 10 WPF + WebView2 desktop app |
cluster-vms.yaml, examples\, templates\ |
Sample definitions |
schemas\ |
JSON schemas |
tests\Run-Tests.ps1 |
Offline tests; no extra modules, no vCenter, no excuses |
adapters\ |
Terraform, Kubernetes, and a plan-only Azure Pipelines file |
tools\ |
Release build and icon generation |
legacy\ |
Retired scripts, kept so nobody asks where they went |
docs\ |
Runbook, prerequisites, definition guide, evaluation, plan |
build.cmdChecks that the version matches everywhere and has a CHANGELOG entry, runs the tests, publishes a self-contained single-file exe, smoke-tests the thing it just published, then zips and hashes it. Tests only: pwsh -File .\tests\Run-Tests.ps1.
- Definitions never hold secrets. Put a password field in one and planning refuses it.
- Answer media does hold credentials. The admin password is encoded, which is not encryption. The domain-join password is plain text, because that's how Windows wants it. The media folder is limited to you, SYSTEM, and Administrators. Delete it after the build.
- Install ISOs are checked against the publisher's SHA-256. Nothing is downloaded or installed behind your back.
Report vulnerabilities privately; see SECURITY.md.
This tool creates and powers on virtual machines and writes credentials onto installation media. It is provided "as is", without warranty of any kind (see LICENSE). Test every definition against non-production infrastructure first; you are responsible for what it builds. Not affiliated with or endorsed by Broadcom/VMware, Microsoft, Red Hat, or the Rocky and Alma projects; product names describe compatibility only.
MIT. Copyright (c) 2019-2026 mikedopp. See LICENSE.
The release build redistributes the .NET runtime (MIT), the WebView2 SDK loader (BSD-3-Clause), and the Glimmer version orb (MIT, after "orb" by LerSent001, MIT) with its editor's libraries. Every component and its license text is listed in THIRD_PARTY_NOTICES.md and licenses/.







