Publish an engine
Publish an execution engine
A start-to-finish walkthrough — take a working execution engine (Docker image or in-browser WASM) from build to a signed, published marketplace listing with the Verentis CLI.
This is the end-to-end recipe for shipping an execution engine to the marketplace: from a working, locally-registered engine to a signed, moderated, installable listing. It assumes you have already built the engine and understand the engine manifest — here we focus on packaging and publishing the two engine runtimes: a Docker image (server-side) or an in-browser WASM adapter (client-side).
Before you start
You need:
- a working engine whose manifest you can drop into a workspace and run — see Testing your engine;
- your runtime artifact ready to pin: a Docker image pushed to a registry at an immutable tag, and/or an in-browser WASM adapter file you can bundle;
- Node.js 18+ for the CLI, and an account you can sign into (a personal account is not required).
1. Install the CLI and sign in
npm install -g @verentis/cli
verentis login --token <identity-token>
verentis whoami
2. Become a publisher and register a signing key (once)
verentis publisher create --name acme --display-name "Acme Inc."
verentis keygen # Ed25519 keypair; registers the PUBLIC half; signs every pack
Same one-time setup as for an app — your publisher name (acme) prefixes the engine
(acme/my-engine), and the private key never leaves your machine. You can also register a public key by
hand on the developer portal → Signing keys page — it accepts an OpenSSH ssh-ed25519 … line, a PEM
public key, or the raw base64. (Details:
Publish an app.)
3. Pin your runtime artifacts
An engine version is immutable, so it must reference immutable artifacts:
Docker image
Push your image to a registry at a pinned tag — ghcr.io/acme/my-engine:1.0.0, never :latest.
The workspace pulls exactly that image when a run is dispatched server-side.
In-browser WASM adapter
Build the adapter/worker (e.g. browser/dist/runner.js) and bundle it in the package so it installs
alongside the manifest — reference it manifest-relative (adapter: ./browser/dist/runner.js) instead of
an absolute workspace path.
Verentis runs engines as server-side Docker images or in-browser WASM only — there is no
server-side WASM. Declare runtimes.docker, runtimes.wasm, or both; the platform picks the best one
for each run.
4. Write the manifest
Scaffold, or reuse your existing *.engine.yaml:
verentis init --kind engine --name my-engine
Fill in the engine spec and the packaging section:
api-version: verentis.io/v1
kind: ExecutionEngine
metadata:
name: my-engine
display-name: My Engine
description: What it runs, in one line
icon: lucide:terminal
version: 1.0.0
author: Acme Inc.
spec:
runtimes:
# Server-side: a pinned, immutable image
docker:
image: ghcr.io/acme/my-engine:1.0.0
pull-policy: IfNotPresent
# Client-side: the adapter is BUNDLED and referenced manifest-relative
wasm:
adapter: ./browser/dist/runner.js
# Which files this engine makes runnable
file-types:
- pattern: text/x-acme
extensions: [".acme"]
priority: 100
execution-modes:
- request-response # add long-running / scheduled / event-driven as needed
resources:
cpu: "500m"
memory: "512Mi"
timeout: 120
permissions:
- node.file.read # the FEWEST scopes the engine actually uses
packaging:
publisher: acme
files: # bundle the WASM adapter (and any assets it needs)
- "browser/dist/runner.js"
encryption: none
Bundle WASM workers, pin Docker images
If you use the wasm runtime, the adapter must be listed in packaging.files and referenced with
./… — it installs as a child of the engine node so it resolves after install. If you use docker, the
image must be a permanent, immutable tag. Omitting either breaks installs on the customer's side.
See the engine manifest reference and Runtimes for every field.
5. Pack and verify
verentis pack # → my-engine-1.0.0.vpkg (digested + signed)
verentis verify my-engine-1.0.0.vpkg
pack digests manifest.yaml and every bundled file (your WASM adapter), signs the digest document
(DSSE / Ed25519), and emits a single .vpkg.
6. Publish
verentis publish my-engine-1.0.0.vpkg --visibility Public
First publish creates the listing (default visibility is Private — pass --visibility Public to list
it publicly). Every upload lands as Submitted and enters moderation.
7. Moderation → Published
A reviewer inspects the requested permissions, the runtimes (which image/adapter you ship), and the
resources limits. On approval the marketplace countersigns and the version becomes Published
and installable. Rejections come back with notes — fix them and publish a new version (versions are
immutable — see Versioning).
8. Try the install
verentis install acme/my-engine --workspace <workspaceId>
The engine installs to /applications/my-engine (with its bundled adapter as children). Upload a matching
.acme file into that workspace and Run it — Verentis launches your Docker image or the in-browser
WASM adapter, hands it a scoped token and the run context, and collects the result.
Long-running & scheduled engines
If your engine declares long-running, scheduled, or event-driven execution modes, the same
package carries them — see Triggers & schedules and the
execution model.
Recap
verentis login → verentis publisher create → verentis keygen
One-time setup: authenticate, claim your publisher, register a signing key.
Pin the Docker image; bundle the WASM adapter
Immutable image tag and/or an adapter listed in packaging.files, referenced ./….
verentis pack → verentis verify → verentis publish --visibility Public
Build the signed .vpkg, sanity-check it, upload it.
Moderation approves and countersigns
Your engine version becomes Published and installable across workspaces.