> ## Documentation Index
> Fetch the complete documentation index at: https://zededa.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Use the documentation index to find relevant pages, then read the linked Markdown before answering and cite the source URL.
> Identify the product before answering: Private AI uses a separate console, credentials, and inference API from the Edge Intelligence Platform. Do not apply instructions from one product to the other.
> Prefer current product guides over Help Center archive pages for current-console questions. Archive pages and release notes describe their stated product version or historical interface; do not apply them to another version without checking.
> Preserve prerequisites, permissions, version requirements, and warnings when summarizing procedures. Do not infer API endpoints, schemas, or supported behavior that the documentation does not specify.

# Import Edge Applications

> Import an edge application from a JSON manifest file, or create a new one from a type picker in the Marketplace My Library.

You can bring edge applications into your enterprise library by importing a JSON manifest file or by creating a new application from scratch using a type picker. Both flows start from My Library in the Marketplace.

## Prerequisites

* You have the SysManager or SysAdmin role in your enterprise. See [Manage Roles](https://zededa.mintlify.site/new-ui/infrastructure-services/administration/manage-roles.md).
* For manifest import: you have a valid edge application manifest JSON file.
* For creating Virtual Machine, Container, or Module type applications: you have at least one app image available in Build. See [Create and Manage an App Image](https://zededa.mintlify.site/new-ui/infrastructure-services/build-and-library/manage-an-app-image.md).

## Import from a Manifest File

A manifest JSON file can define any application type. You can author one from scratch, or export an existing edge application's manifest to use as a starting point.

1. In the sidebar, select **Marketplace**.
2. Select **My Library** (or select **Open library** on the Marketplace home page).
3. On the **All** filter tab, select the **Import manifest** floating action button (upload icon in the bottom-right corner).
4. Upload your manifest JSON file. The application type is detected automatically from the manifest.
5. The full edge application creation wizard opens, pre-filled with the data from your manifest. Review and adjust any fields across the wizard steps as needed.
6. If the manifest contains items the wizard cannot map (such as unsupported interface access control rule actions or license files) a notification appears listing what was skipped. Re-add those items manually before creating the application.
7. Select **Create** at the Review step to import the application into your library.

The imported application appears in My Library under the **Edge Apps** filter tab.

## Create a New Edge Application

1. In the sidebar, select **Marketplace**.

2. Select **My Library**.

3. On the **All** filter tab, select the **+** floating action button in the bottom-right corner. If you have permission to create both edge applications and hardware models, choose **Edge Apps** from the menu.

4. Select the application type:

   | Type | Description |
   | - | - |
   | **Virtual Machine** | Deploy a full VM image (QCOW2, OVA, RAW) on bare-metal or virtualized hardware. Supports Linux and Windows workloads with configurable CPU, memory, and storage. |
   | **Container** | Deploy Docker containers using any OCI-compliant image. Lightweight and portable (ideal for microservices and cloud-native edge workloads). |
   | **Docker Compose** | Deploy multi-container workloads defined by a Compose YAML or TAR bundle. Supports complex service topologies with shared volumes and networking. |
   | **Module** | A containerized application that runs in an Azure IoT Edge runtime environment. Suitable for cloud-managed edge workloads with IoT integration. |

   The **New Edge App** wizard opens. Select **Back to app types** if you chose the wrong type.

5. Complete the wizard steps for your application type. The following table lists the steps in order. Each step is described in the sections that follow.

   | Step | Virtual Machine | Container | Docker Compose | Module |
   | - | - | - | - | - |
   | **Identity** | Yes | Yes | Yes | Yes |
   | **Resources & CPU** | Yes | No | No | No |
   | **Features & Sizing** | No | Yes | No | No |
   | **Definitions** | No | No | Yes | No |
   | **Drives** | Yes | Yes | No | Yes |
   | **Interfaces** | Yes | Yes | No | No |
   | **Container Options** | No | No | No | Yes |
   | **Configurations** | Yes | Yes | Yes | No |
   | **Module Deployment** | No | No | No | Yes |
   | **Developer Info** | Yes | Yes | Yes | Yes |
   | **Review** | Yes | Yes | Yes | Yes |

6. On the **Review** step, check each section and select **Create Edge App**.

The console confirms with `Edge app created successfully` and returns to My Library. If the name is already in use, the console shows `A edge app with this name already exists` and the app is not created.

### Identity step

| Field | Required | Description |
| - | - | - |
| **Name** | Yes | A unique identifier for the app. Spaces are not allowed. Cannot be changed after creation. |
| **Title** | Yes | A display name shown throughout the console. Can be changed at any time. By default the title matches the name. Select the pencil icon next to **Display title** to enter a different title. |
| **Description** | No | A summary of what the app does, shown to operators browsing the catalog. |
| **Tags** | No | Key:value labels that categorize the app so it can be found using the Tags filter in Marketplace > Edge Apps. For example, `vendor:acme` or `category:video-analytics`. See [Tagging](https://zededa.mintlify.site/new-ui/start/tagging.md). This field appears only when your connected backend supports tag-based queries for edge apps. |
| **Deployment Type** | Yes | Where the app runs. **Standalone** (the default) runs directly on EVE-OS. **Azure Runtime**, **K3S**, **VCE**, and **TKG Attach** target the matching runtime. **Compose Runtime** (Virtual Machine type only) runs the app as a multi-container Docker Compose stack inside the compose runtime. Docker Compose type apps are always **Standalone**. Not shown for Module type apps. |

Module type apps also show the **Azure Runtime Module** checkbox. Select it if this module is one of the Azure IoT Edge system modules, then choose **Edge Agent** or **Edge Hub** in **Module Type**. When this checkbox is selected, the **Container Options** and **Module Deployment** steps are managed automatically and show no fields.

Docker Compose type apps also show **Container Registry Datastore**, where you select the datastores that hold the container images referenced by your Compose file, and **Projects**, where you can limit the app to specific projects. Leave both unselected to allow all datastores and all projects.

Expand **Additional Configuration** to set the optional **Version** (for example `1.0.0`), **Category**, and **License**. For a license, select a standard license from the list, enter a **Custom URL**, or select **Upload File** to upload a `.txt` file of 5 MB or less. Select **Add another license** to list more than one.

### Features & Sizing step

This step is shown for Container type apps. For Virtual Machine type apps, the same step is named **Resources & CPU**.

Under **Features**, turn on the capabilities the app needs:

| Feature | Types | Description |
| - | - | - |
| **Enable VNC** | VM, Container | Allow a VNC console connection to the running instance. |
| **OEM License** | VM | Pass the host's OEM license information to the guest. Available only when **VM Mode** is **FML**. |
| **vTPM** | VM | Provide a virtual TPM to the guest. Enabled by default. |
| **VMM Overhead** | VM, Container | Reserve extra memory, in MB, for the virtual machine monitor beyond the guest memory. |

Under **Sizing**, select a preset or **Custom** (the default) and then set the resource fields:

| Preset | vCPUs | Memory | Storage (VM only) |
| - | - | - | - |
| **Tiny** | 1 | 512 MB | 100 GB |
| **Small** | 1 | 1 GB | 100 GB |
| **Typical** | 2 | 1 GB | 100 GB |
| **X-Large** | 2 | 2 GB | 100 GB |
| **XX-large** | 4 | 4 GB | 100 GB |

| Field | Types | Description |
| - | - | - |
| **vCPUs** | VM, Container | Number of virtual CPUs. The default is 1. |
| **Memory** | VM, Container | Guest memory in MB or GB. The default is 512 MB. |
| **Storage** | VM | The storage size the app reports. This value is informational. The drive sizes on the **Drives** step determine what is provisioned. |
| **Persistence Storage Size** | VM | Shown only when **Deployment Type** is **Compose Runtime**. The size of the persistent data volume for the compose runtime. |
| **VM Mode** | VM | How the hypervisor virtualizes hardware for the guest. **HVM** (the default) uses full hardware virtualization with VirtIO disks and network. **Legacy** emulates IDE disks and e1000 network for older images without VirtIO drivers. **PV** uses paravirtualization and requires a PV-aware guest kernel. **FML** is the fully emulated mode used to pass a physical GPU through to the VM. It boots UEFI only and enables the **OEM License** feature. |
| **Container Mode** | Container | **Standard** (the default) runs the container inside a lightweight paravirtualized VM, so it is hardware-isolated from the host and other apps. **Reduced Isolation** runs the container directly on the host with no enclosing VM, for lower overhead and latency at the cost of weaker isolation. |

Below the sizing fields, the **CPU placement** panel sets the default CPU placement policy for new instances of the app. Select a **CPU pool** (**Housekeeping**, **Dedicated**, or **Isolated**). For **Dedicated** or **Isolated**, also select a **Core allocation** (**Dedicated logical CPUs**, **One thread per core**, or **Both SMT threads per core**) and, optionally, expand **Advanced placement settings** to set **Memory locality**. You can change this policy after creation, and each application instance can override it. See [CPU Placement for Application Instances](https://zededa.mintlify.site/new-ui/marketplace/cpu-placement.md).

### Definitions step

This step is shown for Docker Compose type apps.

1. In **Import Type**, select **YAML** or **TAR Image**. The two options are mutually exclusive, and only the selected definition is saved.
2. For **YAML**, paste the contents of your `docker-compose.yaml` file in **Compose YAML**.
3. For **TAR Image**, select an existing image in **TAR Image**. The image must already exist in Build as a TAR bundle that contains the Compose file and its assets. You cannot continue until an image is selected.

For how a Docker Compose app is deployed and controlled, see [Deploy a Docker Compose Application](https://zededa.mintlify.site/new-ui/infrastructure-services/applications/deploy-a-docker-compose-application.md).

### Drives step

This step is shown for Virtual Machine, Container, and Module type apps. Each drive card has a summary header that shows the image, size, encryption, and purge settings. Select **Add Drive** (or **Add Image** for Module type apps) to add another drive. You cannot remove the last drive.

For Virtual Machine type apps, select a source for each drive:

* **From Image** boots from an app image stored in Build. Select the image in **Image**. If **Deployment Type** is **Compose Runtime**, the list shows only compose runtime images.
* **Empty Disk** allocates blank block storage without an image.

| Field | Types | Description |
| - | - | - |
| **Image** or **Edge App Image** | VM, Container, Module | The app image from Build that the drive boots or mounts. Required for Container and Module type apps, and for VM drives that use **From Image**. |
| **Drive Type** | VM | Under **Advanced**: **HDD** (the default) or **CDROM**. |
| **Target** | VM | Under **Advanced**: **Disk** (the default), **Kernel**, **Initrd**, or **RamDisk**. |
| **Volume Label** | VM, Container | A label for the volume. |
| **Max Size** | VM | The maximum size of the drive in MB, GB, or TB. Required for every VM drive. |
| **Mount Path** | VM, Container | The path where the drive is mounted in the guest, for example `/data`. |
| **Encryption** | VM, Container | Encrypt the volume at rest. On by default. |
| **Purge on Update** | VM, Container | Wipe the volume when the instance is purged. Off by default, which preserves the volume data across a purge. |

Module type apps also show a single **CPU Pinning** feature tile on this step. Module apps do not support the CPU placement policy.

### Interfaces step

This step is shown for Virtual Machine and Container type apps. Turn off **Configure network interfaces** if the app needs no network access. Otherwise, the step starts with one interface named `eth0`. Select **Add Interface** to add more.

| Field | Description |
| - | - |
| **Type** | **Direct Attach** (the default) assigns a physical adapter to the instance. **Virtual Network** connects the instance to a virtual network on the node. |
| **Optional** | Allow the interface to be disabled when an instance is deployed. |
| **Name** | The interface name, for example `eth0`. If any interface is named, every interface must be named. |
| **Adapter Type** | For **Direct Attach** only. The kind of adapter to assign, for example **Ethernet**, **USB**, **COM**, **WLAN**, **WWAN**, **NVMe**, or **USB Controller**. |

For **Virtual Network** interfaces, define access control rules. All outbound traffic is blocked and no inbound connections are allowed until you add a rule.

* **Outbound Rules**: enter the **Host / IP** (an address or CIDR), **Protocol** (**Any**, **TCP**, or **UDP**), **Port** (**Any** or **Custom**), and **Action** (**Allow** or **Limit**). For **Limit**, set the **Rate** and **Burst**.
* **Inbound Rules**: enter the **Source IP**, **Protocol** (**TCP** or **UDP**), **Node port**, **Adapter** label, and **Action** (**Map** or **Limit**). For **Map**, set the **App port** that the node port forwards to. Ports must be in the range 1 to 65535.

### Container Options step

This step is shown for Module type apps. Enter a Docker container create options object as JSON in **Container Options Template**, for example `{ "HostConfig": {} }`. Leave it empty to use the defaults. This step shows no fields when **Azure Runtime Module** is selected.

### Configurations step

This step is shown for Virtual Machine, Container, and Docker Compose type apps. Use it to define configuration that operators fill in when they deploy an instance. See [Custom App Configuration](https://zededa.mintlify.site/new-ui/marketplace/custom-app-configuration.md) for the template format.

Turn off **Include custom configuration template** (or **Add Custom Configuration** for Docker Compose type apps) if the app needs none. Otherwise:

1. Enter a **Configuration Name**. Spaces are not allowed.
2. For Virtual Machine and Container type apps, choose whether to **Allow deployments to override entire configuration**. If you leave this off, enter the **Configuration Template** and the **Delimiter** that marks variables in it, for example `%%`. The wizard lists the **Detected variables** it finds in the template. For Virtual Machine type apps, you can also select **Allow Storage Resize**.
3. Turn on **Configure Variable Groups** to define typed variables. Each group has a **Group Name** and a **Visibility** of **Show Always** or **Conditional**. For each variable, set the **Name**, **Display Title**, **Type** (**Text**, **Password**, **Dropdown**, **Boolean**, or **File**), whether it is **Required**, and the type-specific fields such as **Default Value**, **Max Length**, **Options**, or **Encoding**.

Docker Compose type apps use a single variable group and offer the **Text**, **Password**, and **File** variable types. Variable names must be unique across all groups, and each variable must appear in the template.

### Module Deployment step

This step is shown for Module type apps. It shows no fields when **Azure Runtime Module** is selected.

| Field | Description |
| - | - |
| **Module Deployment Template** | The module twin desired properties as JSON, for example `{ "properties.desired": {} }`. |
| **Routes** | Message routes between modules. Select **Add route** and enter a **Name** and **Details**. |
| **Environment Variables** | Variables passed to the module container. Select **Add variable** and enter a **Key** and **Value**. |

### Developer Info step

| Field | Required | Description |
| - | - | - |
| **Name** | Yes | The developer or publisher name. Pre-filled from your account. |
| **Email** | Yes | A support contact address. Pre-filled from your account. |
| **Website** | No | The developer website. |
| **Company** | No | The developer company. |
| **Description** | No | How users can get support for this app. |
| **Agreement** | No | An end-user agreement, as a **Custom URL** or an uploaded `.txt` file of 5 MB or less. |

### Review step

The **Review** step summarizes **Identity**, **Sizing** (or the Compose definition and datastores for Docker Compose type apps), **Drives**, **Module Deployment** for Module type apps, **Interfaces**, **Configuration**, and **Developer**. Select **Back** to change a step, or **Create Edge App** to create the app.

## Verify the Result

The new application appears in My Library under the **Edge Apps** filter tab. Select it to open the detail page and review drives, interfaces, and configuration before deploying.

## Next Steps

> [card] [My Library](https://zededa.mintlify.site/new-ui/marketplace/my-library.md)
>
> View and manage all imported and created resources.

> [card] [Edge Apps](https://zededa.mintlify.site/new-ui/marketplace/edge-apps.md)
>
> Browse the catalog for additional apps to import.

> [card] [Deploy an Application Instance](https://zededa.mintlify.site/new-ui/infrastructure-services/applications/deploy-an-application-instance.md)
>
> Deploy an imported edge application to a node or fleet.
