Skip to main content

wimcast

Python versions License Code style Types SemVer Conventional Commits

Build Windows images for Foreman on Linux.

wimcast turns Windows ISOs into a Foreman-ready HTTP tree of per-edition WIM files. It is a drop-in replacement for WIMan / GenerateWIM.ps1, running unprivileged on Linux: no Windows host, no root, no mount(2), no FUSE, no ADK.

sources/<arch>/<name>/*.iso   -->   finalized/<arch>/<name>/
                                        sources/
                                          boot.wim
                                          ServerStandard.wim
                                          ServerDatacenter.wim
                                          images.ini
                                          drivers/...
                                        wimboot
                                        bootmgr, bootmgr.efi
                                        boot/boot.sdi, boot/bcd
                                        build.json

Why wimcast

Problem wimcast solution
WIMan needs Windows, the ADK and an admin shell Any Linux machine, unprivileged
Serial builds, one ISO at a time Parallel scheduler with CPU semaphores
Downloads latest wimboot on every build (non-reproducible) Pinned, checksummed wimboot
Full re-export of unchanged ISOs Content-addressed cache: unchanged ISO skips re-export
Driver tree never published (production bug in WIMan) sources/drivers/ published for deploy-time DISM

Quick start

uv tool install wimcast   # or: pipx install wimcast

wimcast doctor                 # check prerequisites (safe, installs nothing)
wimcast probe sources/         # inspect your ISOs before building
wimcast build sources/         # build the finalized/ tree
ls finalized/                  # ready to serve over HTTP

That's it. Three commands from zero to a deployable tree.

Installation

uv tool install wimcast
# or: pipx install wimcast
# or: python3.12 -m pip install --user wimcast

Debian/Ubuntu:

sudo apt install wimtools
uv tool install wimcast   # pycdlib is installed as a dependency

wimcast doctor tells you exactly what is missing, and whether it is required or only conditional.

Deploy to Foreman

The full walkthrough (deployment repo, CI pipeline, web server, Foreman setup with Ansible) is in docs/foreman-integration.md.

The 30-second version:

  1. Create a deployment repo with your ISOs:

    deploy-repo/
      sources/<arch>/<name>/*.iso     # your ISOs
      .gitlab-ci.yml                  # copy ci/examples/deploy-pipeline.yml
      wimcast.toml                    # optional, see ci/examples/wimcast.toml
    
  2. Configure 4 CI/CD variables: WEB_SERVER, WEB_SERVER_URL, WEB_SERVER_USER, SSH_PRIVATE_KEY_B64.

  3. Push: the pipeline runs init -> build -> deploy -> verify and your finalized/ tree lands on your web server.

  4. Configure Foreman (media, OS, provisioning template): see the Ansible playbook in docs/foreman-integration.md.

Ready-to-copy files:

File Purpose
ci/examples/deploy-pipeline.yml GitLab CI for the deployment repo
ci/examples/wimcast.toml Example configuration

Commands

Command What it does
wimcast doctor Check the runtime contract (required + conditional tools)
wimcast probe [path] Inspect ISO(s) without building: backend, WIM paths, per-index image metadata
wimcast build [path] Build all sources into ./finalized

Global flags: --version, --config <path>, -v/--verbose.

Configuration

wimcast.toml in the working directory, all values optional. A missing file yields the defaults; an invalid value is an error.

[winpe]
source = "iso"          # "iso" (default): boot.wim index 1 from the ISO
# source = "file"       # externally prepared WinPE (e.g. ADK-built)
# path   = "assets/boot-winpe-amd64.wim"
# sha256 = "..."
iso_index = 1           # boot.wim index to export as WinPE base

[editions]
allowed = []            # substring match on image name; e.g. ["Standard", "Datacenter"]

[output]
filename_scheme = "installationtype"   # or "editionid" or "install"

[wimboot]
version = "2.9.0"       # pinned version, verified by checksum
# sha256 = "..."        # required for an unpinned version; overrides the built-in digest

[jobs]
cpu = 0                 # concurrent wimlib-imagex calls (0 = auto-detect)

[cache]
directory = ".cache"    # content-addressed store; unset = no cache

[tools]
wimlib_imagex = "wimlib-imagex"   # override binary path if not in PATH
sevenzip = "7z"                   # ISO fallback backend

wimboot is downloaded once from the pin's GitHub release and then cached. The built-in SHA-256 is checked before use; override [wimboot] sha256 to pin a different release, including offline mirrors.

Requirements

Tool Minimum Package Required
Python 3.12 python3 yes
wimlib-imagex 1.13 wimtools yes
pycdlib 1.20 pip dependency yes
7zz - p7zip-full no (ISO fallback backend)
rsync - rsync no (deployment pipeline)
qemu-system-x86_64 - qemu-system no (smoke test)

Drivers

  • boot.wim (WinPE): INF trees from winpe/drivers/ are added into the WIM under \Drivers\ and loaded with drvload in startnet.cmd before wpeinit.
  • install.wim (installed OS): the driver tree is published into finalized/<arch>/<name>/sources/drivers/ and applied at deploy time by dism /image:W:\ /add-driver /recurse inside WinPE. Offline injection into install.wim needs DISM, so it is not done on Linux.

Windows versions

Supported target: Windows Server 2016/2019/2022/2025 and Windows 10/11 (amd64). wimcast probe reports the backend actually used per ISO; the live test matrix is maintained in docs/compatibility.md.

Non-goals (deliberate)

  • Offline update integration (.msu/.cab): updates/ is warned about and ignored. Patching happens after deployment (Ansible/WSUS/GPO).
  • Offline driver injection into install.wim: drivers are published as a tree and injected by DISM inside WinPE at deploy time.
  • ISO authoring: the output is an HTTP tree, not bootable media.

Contributing

See CONTRIBUTING.md: architecture, module map, quality gates, conventions, release process.

License

MIT

Metadata

Release files for wimcast 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for wimcast 0.1.0
File Size Uploaded Provenance
wimcast-0.1.0.tar.gz 78.9 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for wimcast 0.1.0
File Interpreter ABI Platform
wimcast-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 119.1 kB

Release files / wimcast-0.1.0.tar.gz

Download URL wimcast-0.1.0.tar.gz
Size 78.9 kB
Tags Source
SHA-256 checksum
How to use checksums
c77dfc96c9d9b2a92e28746d6c091f4fe632272750c0219e17f93c2417c1f085
BLAKE2b-256 checksum
How to use checksums
b8e714a8b4a5116fecb5878b9a0008ab51ce884c38559fcffd998fab8f14b75e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.2.0 CPython/3.12.15

Release files / wimcast-0.1.0-py3-none-any.whl

Download URL wimcast-0.1.0-py3-none-any.whl
Size 40.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b8e51d7a0836f37e2b8b97835b995c9c405035d962a52efd8b8f99bf488fde1d
BLAKE2b-256 checksum
How to use checksums
6e3088f1ae7a7019329f23e19c405ace42d306a85c4e42e7b73c8c8bc36d4964
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.2.0 CPython/3.12.15

Security for wimcast 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page