Verentis

Packaging

Packaging your extension

Build a signed .vpkg with the Verentis CLI — the packaging manifest section, bundled files, signing, optional encryption, and the pre-publish checklist.

A marketplace package is a .vpkg — a gzip tarball built by verentis pack that carries everything a workspace needs:

manifest.yaml                       # your app/engine/bundle manifest (always plaintext)
files/                              # bundled payload → children of the installed manifest node
  schemas/report.schema.json
  browser/dist/worker.js
catalog/                            # optional marketplace presentation (always plaintext)
  index.json
  assets/<sha256>.svg
  docs/<sha256>.md
.verentis/
  package.yaml                      # name, publisher, version, kind
  digests.json                      # sha256 per entry — the signing payload
  signatures/developer.dsse.json    # your Ed25519 signature (added by pack)
  signatures/marketplace.dsse.json  # marketplace countersignature (added on approval)
  encryption.json                   # present only for encrypted packages

Package identity is {publisher}/{name}@{version}. By default an application or engine record installs at /applications/{name} (for example /applications/my-app). Payload files remain children of that record unless an application uses spec.install[] to place them elsewhere. Manifest-relative references still work for child payloads: json-schema.source: ./schemas/report.schema.json and runtimes.wasm.adapter: ./browser/dist/worker.js resolve to the bundled files.

The packaging section

Add a top-level packaging section to your manifest:

packaging:
  publisher: acme            # your publisher name
  files:                     # globs (relative to the manifest) selecting the payload
    - "schemas/**/*.json"
    - "browser/dist/worker.js"
  encryption: none           # none | optional | required
  bundle:                    # (Bundle kind only)
    default-path: /data/my-bundle

An explicit files list selects the complete payload and overrides automatic selection. Without it, the packer derives payload files from manifest-relative schema source values and spec.install[].from globs. Declare files whenever the package needs additional files such as engine workers or bundle content.

Marketplace presentation

The optional top-level marketplace block is independent of packaging.files:

marketplace:
  logo: ./marketplace/logo.svg
  hero:
    source: ./marketplace/hero.webp
    alt: Workflow editor overview
  images:
    - source: ./marketplace/editor.webp
      alt: Editor showing a completed workflow
  readme: ./README.md
  changelog: ./CHANGELOG.md
  assets:
    - "marketplace/docs/**/*.{png,jpg,jpeg,webp,svg}"

verentis pack writes these files to deterministic, content-addressed catalog/assets/** and catalog/docs/** entries described by catalog/index.json. Catalog entries are covered by package digests and signatures but stay plaintext even when the payload is encrypted.

Pack, verify, publish

verentis pack                 # → my-app-0.1.0.vpkg (digested + signed)
verentis verify my-app-0.1.0.vpkg
verentis publish my-app-0.1.0.vpkg

pack computes a sha256 digest for the manifest and every payload entry; the registry rejects any tampered upload. With a signing key configured (verentis keygen) the digest document is signed (DSSE, Ed25519) — publishers with registered keys must sign.

Encrypted packages

For proprietary payloads, verentis pack --encrypt seals every files/ entry with AES-256-GCM. manifest.yaml, catalog/**, and .verentis/** stay plaintext so discovery, moderation, presentation, and registration keep working. The content key is wrapped per recipient. Configure the platform recipient with verentis login --sealing-key <base64> (or VERENTIS_SEALING_KEY), or provide custom recipients via --recipient id=base64Key; packing fails if no recipient is available.

Encrypted packages install sealed: the tarball stays intact as a single node and members are decrypted transiently by the platform on read — plaintext never lands in the workspace tree.

Production readiness

Host the app over HTTPS at a stable URL

Deploy your web app to a permanent HTTPS URL and set spec.entry to it. Set oauth.redirect-uris to the production callback URL(s) — they must match exactly.

Pin engine images, bundle workers

Push Docker images at an immutable tag (:1.0.0, not :latest). Bundle in-browser workers in the package (packaging.files) and reference them manifest-relative (adapter: ./browser/dist/worker.js).

Lock down the sandbox

Ship with the tightest sandbox flags that still work — moderators and admins see these at review and consent.

Request minimal permissions

Trim permissions to exactly the scopes you use. This is the core of the moderation review.

Verify resolution

Confirm your mime-types / file-types claim the right files at sensible priorities.

Pre-publish checklist

Stable artifacts

entry URL / image tag are permanent and immutable; workers and schemas are bundled, not hand-uploaded.

Relative references

Bundled files referenced ./… relative to the manifest — no absolute workspace paths.

Signed

verentis keygen run once; verify shows a valid developer signature.

Minimal permissions & tight sandbox

Only the scopes you use; narrowest isolation that works.

Versioned

metadata.version set; versions are immutable once published.

Next