Skip to Content
DocsControl PanelApp Marketplace

App Marketplace

The Apps tab of the Marketplace lists the Cloud OS apps you can deploy to your fleet: Nextcloud, Immich, Gitea, Grafana and more. Each card shows how many of your nodes already run the app (“on 980 nodes”). Deploy to group… installs the app on a whole group of nodes in one step and shows the progress as it happens.

The Skill Marketplace (AI skills) is the second tab, Skills (/marketplace?tab=skills), and works as before.

The catalogue

The catalogue is the same set of app templates your nodes install from, so every app in the list can run on Cloud OS. For each app you see:

FieldDescription
Name, icon, categoryFrom the app template
VersionTemplate version the deploy will install
On N nodesNodes in your workspace that run the app (N running)
InputsSettings the app asks for at install time, such as an admin email

A node counts as running an app when its app inventory (sent with every heartbeat) has a container for that app. The match uses the app id or the app’s own image. Shared images such as Postgres or Redis are ignored.

Deploying to a group

  1. Click Deploy to group… on an app.
  2. Pick a node group, or pick individual nodes.
  3. Fill in the app’s required inputs.
  4. Confirm. Every target node is sent an install command.

While it runs, the app’s button turns into a progress bar (“Deploying · 6/12”) that fills as nodes finish; click it for the per-node list. Recent deployments under the grid lists the last 50 deployments with their state and progress.

The deployment shows per-node status and an overall state: queued, running, completed, partial (some nodes failed) or failed. Offline nodes install the app the next time they check in. When a node’s plan app limit is reached, that node fails with the upgrade message and the other nodes carry on.

API

EndpointMethodDescription
/api/marketplace/appsGETCatalogue with install_count / running_count. Filter with ?category= and ?q=.
/api/marketplace/apps/{id}GETOne app plus the nodes it’s installed on
/api/marketplace/apps/{id}/deployPOSTDeploy. Body: {"group_id": "..."} or {"instance_ids": [...]}, plus "params": {"admin_email": "..."}
/api/marketplace/deploymentsGETRecent deployments with progress (?app_id=)
/api/marketplace/deployments/{id}GETOne deployment with per-node items

Deploy responses and deployment details share one shape:

{ "id": "…", "app_id": "gitea", "app_version": "1.22", "target_kind": "group", "group_id": "…", "target_desc": "group eu-edge (3 nodes)", "params": { "admin_email": "[email protected]" }, "job_id": "…", "progress": { "total": 3, "pending": 0, "running": 1, "succeeded": 2, "failed": 0, "done_pct": 66.7, "state": "running" }, "items": [ { "instance_id": "…", "host": "edge-eu-01", "command_id": "…", "status": "completed" } ] }

Deploying needs the fleet:write permission. Browsing needs fleet:read.

Next Steps