A Project is the top-level organizational unit in ZEDEDA Cloud. Every asset you create — edge nodes, app instances, network instances, volumes, images, datastores, and policies — belongs to exactly one project. Projects define access control scope, policy inheritance, and the boundary for zero-touch deployments. When an edge node checks in, it receives configuration based on its assigned project.
Each project belongs to a single enterprise. An enterprise starts with one default empty project, and you can create as many additional projects as your segmentation requires.
| Type | Profile | Purpose |
|---|---|---|
| Deployment | Regular only | Current recommended type. Uses Zero-Touch Deployments (ZTD) with tag-based policy and app matching. All new projects should use this type. |
| Legacy | Regular | Original project type, still supported. Policies and apps auto-apply to all nodes without tag matching. |
| Legacy | Azure | Integrates with Azure IoT Hub. Supports Azure DPS enrollment (symmetric key or TPM), module policies, and Device CA certificate generation. |
| Status | Meaning |
|---|---|
| Active (purple) | Project is ready to use; all required policies are configured. |
| Inactive (yellow) | Project is not ready; a required policy is missing or misconfigured. |
| Initialized (dark blue) | Project created but no policy has been added yet. |
| Archived (grey) | Not currently used. |
| Unknown (light grey) | Status cannot be determined. |
| Error (red) | Not currently used. |
The project's status rolls up from the status of its attached policies. If any policy is broken or incomplete, the project goes Inactive.
Policies are the key mechanism by which a project controls what happens on every edge node assigned to it. When a node joins a project, all active policies in that project are automatically applied to that node. When a node is removed from a project, policies delivered by that project are revoked.
Enforces remote attestation on every edge node in the project. When enabled:
This uses measured boot (not secure boot). Measured boot records component state into TPM PCR registers for remote verification. It does not block unsigned code from running, but it does make tampering detectable.
To enable: check Enforce Edge Node Attestation in the project's Policies tab.
Automatically deploys one or more network instances to every edge node in the project. This eliminates the need to manually create the same network instance on every node.
Use cases:
How it works: select one or more pre-defined network instances from the dropdown. When a new node is added to the project, EVE-OS receives the network instance config and creates the instance automatically.
Automatically deploys a specified app instance to every edge node in the project. When a new node is added, the app is deployed without any manual step.
Key behaviors:
Use cases:
Controls remote access via the EdgeView feature. EdgeView lets operators open a terminal session to an edge node that is behind a firewall, without requiring a VPN.
Policy settings:
| Setting | Description |
|---|---|
| Allow EdgeView | Master on/off switch for the policy. |
| Max Session Duration (sec) | Maximum lifetime of a single EdgeView session (e.g., 2592000 = 30 days). |
| Max Concurrent Instances | Maximum number of simultaneous EdgeView sessions to any node in the project. |
| Allow Change | Whether operators can modify session parameters at runtime. |
| Dev Access | Allow terminal access to the EVE-OS host (device-level shell). |
| App Access | Allow terminal access into individual app containers/VMs on the node. |
| Ext Access | Allow external (non-ZEDEDA) users to join via JWT invitation. |
How it works:
Note: The EdgeView policy must be enabled at the project level before any EdgeView session can be started on nodes in that project.
A device-level policy delivered to all nodes in the project. Controls node-level behaviors including:
Flow logs are disabled by default. Enable at the project level when you need network traffic visibility for compliance, debugging, or traffic analysis.
Available in Deployment type projects only. Automatically provisions a volume instance on every edge node in the project. Used to pre-stage persistent storage before apps land.
Defined as part of a project deployment (see Zero-Touch Deployments below).
ZTD is exclusive to Deployment type projects. It automates policy assignment and app instance deployment using a tag-matching system.
This means you can:
env:canary get one app version, nodes tagged env:production get anotherEach deployment version can include:
| Config | Purpose |
|---|---|
app-inst-config | Which app bundles to deploy and with what overrides |
net-inst-config | Which network instances to create on matching nodes |
vol-inst-config | Which volume instances to pre-create on matching nodes |
dev-policy-config | Device-level policy (flow logs, metrics, debug) |
edgeview-config | EdgeView policy for remote access |
zcli project create MY_PROJECT \ --description="Workshop project" \ --project-type=deployment \ --deployment-name=MY_DEPLOYMENT-v1 \ --deployment-tag=env:production \ --app-inst-config=./app_config.json \ --net-inst-config=./net_config.json \ --vol-inst-config=./vol_config.json \ --dev-policy-config=./dev_policy.json \ --edgeview-config=./edgeview_policy.json
zcli project update-deployment MY_PROJECT \ --deployment-id=<deployment-id> \ --app-inst-config=./updated_app_config.json \ --deployment-tag=env:production
zcli project update MY_PROJECT --config=flowlogs:true
Flow log records include: source and destination IP, source and destination port, ACL rule applied, and packet and byte counters per flow.
The Name field is permanent and unique within the enterprise. The Title can be changed later. The Type and Profile cannot be changed after creation.
resource "zedcloud_project" "workshop" {
name = "workshop-project"
title = "EVE-KVM Workshop Project"
description = "Workshop project for EVE-OS and EVE-KVM workflows"
type = "DEPLOYMENT"
# Attestation policy
attestation_policy {
enforce = true
}
# Edge App policy: auto-deploy a monitoring agent to all nodes
app_policy {
app_id = zedcloud_application.monitoring_agent.id
}
# EdgeView policy: allow dev and app access, 8-hour sessions
edge_view_policy {
edgeview_allow = true
max_expire_sec = 28800
max_instances = 3
dev = true
app = true
ext = false
}
tag {
key = "env"
value = "workshop"
}
}
POST /v1/projects
{
"name": "workshop-project",
"title": "EVE-KVM Workshop Project",
"type": "PROJECT_TYPE_DEPLOYMENT",
"attestationPolicy": {
"enforceAttestation": true
},
"appPolicy": {
"apps": [{ "id": "<app_bundle_id>" }]
},
"edgeviewPolicy": {
"edgeviewAllow": true,
"maxExpireSec": 28800,
"maxInstances": 3,
"dev": true,
"app": true
},
"tags": { "env": "workshop" }
}
| Pattern | Description | Example |
|---|---|---|
| By environment | Separate projects for dev, staging, prod | env:dev, env:prod tags on deployments |
| By geography | One project per region or site | region:us-east, site:plant-3 |
| By function | Separate projects for different workload types | type:inference, type:connectivity |
| By customer | MSP scenario: one project per tenant | Keeps edge nodes, apps, and data isolated per customer |