# Ship a Plugin ZIP

> Build a production plugin ZIP from one LocalWP Devkit project.

# Ship a Plugin ZIP

When a LocalWP Devkit project is ready to deliver, build a project plugin ZIP from the devkit root:

```sh
bun run build:zip -- --project <slug>
```

The command runs the project check before packaging. If the check fails, fix the project and rerun the command.

## Output

The ZIP is written inside the project:

```text
projects/<slug>/dist/oh-my-idetch-<version>.zip
```

The ZIP root is:

```text
oh-my-idetch/
```

This is the runtime plugin artifact for that project.

## What Goes Into the ZIP

The project ZIP contains the runtime plugin surface:

| Included | Purpose |
| --- | --- |
| `oh-my-idetch.php` | WordPress plugin entry file. |
| `src/**` | Project runtime PHP source. |
| `cms/acf-json/**` | Project CMS field JSON when present. |
| `flags.json` | Production mode marker with `MODE=PROD`. |

The ZIP does not include devkit tooling, project notes, tests, generated agent skills, local environment files, Local site backups, Local Blueprints, or premium plugin files.

## Before You Ship

Run the normal LocalWP verification loop first:

```sh
bun run project:check -- --project <slug>
bun run localwp:sync -- --project <slug>
bun run localwp:doctor -- --project <slug>
bun run localwp:capabilities -- --project <slug>
```

Then verify the site in LocalWP using the bound Local domain. For WooCommerce, facets, dropdowns, drawers, checkout gateways, or other interactive OhMyEtch behavior, browser/runtime verification is required; the project ZIP command only proves the package can be built from checked source.

## Keep the Devkit

Do not duplicate the whole devkit for every site. Keep the devkit as the long-lived workspace and create a new `projects/<slug>` folder for each site. Each project can build its own deployable plugin ZIP.
