Canonical: https://rom-weaver.com/docs/create-bundles

# Share multiple ROM patches as one weave

Package multiple patches, their order, and expected ROM checksums into one download.

<a id="create-and-share-a-patch-weave-in-the-browser"></a>

<a id="create-and-share-a-patch-bundle-in-the-browser"></a>

<!-- START doctoc -->
## Table of contents

- [Choose what to include](<#choose-what-to-include>)
- [Build the patch recipe](<#build-the-patch-recipe>)
- [Turn on weave output and download it](<#turn-on-weave-output-and-download-it>)
- [Test the finished download](<#test-the-finished-download>)
- [Publish a useful release](<#publish-a-useful-release>)
- [Open a hosted weave](<#open-a-hosted-weave>)

<!-- END doctoc -->

See [What a weave is](<https://rom-weaver.com/docs/bundles.md>) for background, or try the [guided Weave Patches tour](<https://rom-weaver.com/weave-patches?guide=weave>) with homebrew files.

## Choose what to include

Leave **Include ROM in weave** clear for a patch-only release. The archive contains the recipe, patches, and expected ROM checksums. Each user supplies the matching ROM.

Select **Include ROM in weave** only for a ROM you can redistribute, such as your own homebrew. Packaging does not grant redistribution rights.

Choose ZIP for broad compatibility, or 7z. This selects the recipe archive format, not the recipient’s patched ROM container.

## Build the patch recipe

1. Open [Weave](<https://rom-weaver.com/weave-patches>).
2. Add the clean ROM and every patch. Add supported ROM cheats through **Add cheats to the patch order** when needed.
3. Put the patches in execution order. Drag a numbered handle, click it to choose a position, or focus it and use the arrow keys.
4. Open each patch's three-dot **Patch actions** menu → **Edit details**. Add a readable name and any description, version, and author users need.
5. Open **Checks** → **Add check** for a known input or output CRC32, MD5, SHA-1, or byte count. Input checks describe the expected bytes. Embedded output checks verify the standalone result, not a combined stack whose earlier patches changed the source. Never guess values.

Set each patch's input selector to the state its checks describe:

1. Keep **Automatic** to let the checks select the state. It then shows the detected state, such as **Original ROM (detected)**.
2. Choose **Original ROM** when the patch was made from the clean ROM.
3. Choose **Previous patch's result** when the patch was made from the result above it.
4. Choose **Output of** a named patch for a dependency. Keep that patch enabled and ordered before its dependent patch.

For discs, select the required track. Keep accumulated execution to continue that track's chain. Test optional switches after reopening the exported weave.

Keep an explicit input and its target on the same track. Cross-track recipes require the [CLI](<https://rom-weaver.com/docs/cli-apply.md>); the browser rejects them before applying.

To include a disc ROM, add an archive containing the disc sheet and every track. A loose CUE or GDI sheet cannot package its track files.

Leave each required patch **On**. Turn a genuine add-on **Off** to make it optional and off by default.

Built-in checks, such as BPS checksums, cannot be edited. Add only values from the author or your tested Original and Modified files.

Reorder only when the patch supports that input state. Test optional combinations as described below, including dependencies.

Each enabled ROM cheat becomes a separate patch at its chosen position. Recipients can toggle each cheat independently. Original patches keep their metadata and optional switches.

Cheat patches record the resolved ROM writes. Compare codes resolve against the enabled changes above them during export. Test optional combinations after reopening the archive.

<a id="turn-on-bundle-output-and-download-it"></a>

## Turn on weave output and download it

1. In the main **Weave** output step, enter the expected output name. It is also used to name the downloaded archive.
2. Choose **.zip** or **.7z** in its format selector.
3. Open **Options** and leave **Include ROM in weave** clear for a patch-only release.
4. Select **Share weave** and wait for the checks and download.
5. Save the archive. The control becomes **Download ZIP weave** or **Download 7z weave** for another copy.

Expand the secondary **Download this ROM** step to test the recipe. Its name and compression settings are shared with Weave: 7z selects a 7z weave; other Apply formats select ZIP. Recheck the Weave format before sharing.

On **Apply**, expand **Download the weave**. On **Create**, this appears in [Patches & cheats mode](<https://rom-weaver.com/docs/create-rom-patches.md#build-from-patches-and-cheats>).

For one patch instead, expand **Download a combined patch** on Apply or Weave.

Checksums verify content; a filename mismatch alone does not block Apply.

Weave creation runs preceding enabled changes when resolving ROM cheats. Download the patched ROM separately.

Files are read locally. Patch-only weaves contain ROM checksums, not ROM bytes.

## Test the finished download

Test the actual archive you will publish:

1. Open a fresh [Apply](<https://rom-weaver.com/apply-patches>) page.
2. Add the downloaded weave archive.
3. For a patch-only weave, add a fresh copy of the documented Original.
4. Confirm the displayed patch order, names, required switches, and optional switches match the release.
5. Run **APPLY & DOWNLOAD**.
6. Compare the result checksum with your intended Modified file.
7. Launch the result in the emulator or hardware you support.
8. Repeat for every optional combination you promise works.

Test rejection too: add a harmless wrong sample file and confirm the weave requests the matching ROM instead of producing output.

Compare the same checksum algorithm on both files. Playing tests only the paths you exercise, not every patch combination.

## Publish a useful release

Follow the [release-notes checklist](<https://rom-weaver.com/docs/create-rom-patches.md#write-useful-release-notes>). Also include the weave archive's checksum and a link to [Open a weave](<https://rom-weaver.com/docs/apply-rom-patches.md#open-a-bundle>).

Explain what the download changes on its release page; do not rely on the recipe alone.

For updates, rebuild from the same clean Original and new patches, update their details, and retest the archive from a fresh page.

<a id="open-a-hosted-bundle-in-apply"></a>

<a id="open-a-hosted-weave-in-apply"></a>

## Open a hosted weave

Share a link that preloads the public weave:

```text
https://rom-weaver.com/weave-patches?weave=https%3A%2F%2Fexample.com%2Frelease.zip
```

Weave links open **Weave**, including links that start on the Apply route. Recipients add their matching ROM, review the recipe, expand **Download this ROM**, and choose **APPLY & DOWNLOAD**. Opening the link does not apply patches automatically.

Use the [copyable Apply-button examples](<https://rom-weaver.com/docs/webapp-integration.md#add-an-apply-button>) for HTML and Markdown release pages.

The host must allow CORS. ROMs stay local. Relative patch URLs resolve against the recipe URL.

See [webapp integration](<https://rom-weaver.com/docs/webapp-integration.md>) for URL parameters, hosting headers, and errors, or the [CLI weave guide](<https://rom-weaver.com/docs/cli-bundles.md>) for scripted creation.
