Verentis

Publish an app

Publish an application

A start-to-finish walkthrough — take a working application from a hosted web page to a signed, published marketplace listing with the Verentis CLI.

This is the end-to-end recipe for shipping an application to the marketplace: from a working, locally-registered app to a signed, moderated, installable listing. It assumes you have already built the app and understand the app manifest — here we focus on packaging and publishing.

Before you start

You need:

  • a working application (its web page hosted over HTTPS at a stable URL) whose manifest you can drop into a workspace and see resolve — see Local development;
  • Node.js 18+ to install the CLI;
  • an account you can sign into (a personal account is not required — a workspace-only user can become a developer).

1. Install the CLI and sign in

npm install -g @verentis/cli

# The CLI targets production by default. Authenticate with a browser device sign-in (just `verentis login`),
# or non-interactively with an identity token from the web app (exchanged per request for short-lived, scoped
# access tokens) or a vrt_ API key.
verentis login --token <identity-token>

verentis whoami            # confirms your identity / publisher, if any

2. Become a publisher (once)

Your publisher is your developer identity; its name prefixes every package you ship (acme/my-app). Create it once:

verentis publisher create \
  --name acme \
  --display-name "Acme Inc." \
  --website https://acme.example \
  --email dev@acme.example

--name must be lowercase and URL-safe. You can also become a developer from the marketplace UI ("Become a developer") — the CLI and UI create the same publisher.

3. Generate a signing key (once)

verentis keygen              # Ed25519 keypair; registers the PUBLIC half with your publisher

The private key stays at ~/.verentis/keys/default.json and never leaves your machine. From now on verentis pack signs every build automatically. A publisher with registered keys must sign its uploads.

Prefer to register a key by hand? The developer portal → Signing keys page accepts a public key in any common Ed25519 format — an OpenSSH line (ssh-ed25519 AAAA… you@host, exactly what you paste into GitHub), a PEM public key, or the raw base64 key. Only the public half is ever uploaded; sign your packages locally with the matching private key.

4. Write the manifest

Scaffold a manifest next to your app, or reuse the *.app.yaml you already develop with:

verentis init --kind application --name my-app

Fill in the app spec and — crucially for packaging — the packaging section:

api-version: verentis.io/v1
kind: Application

metadata:
  name: my-app
  display-name: My App
  description: What it does, in one line
  icon: layout-dashboard
  version: 0.1.0
  author: Acme Inc.

spec:
  entry: https://app.acme.example        # hosted app origin (HTTPS, stable)
  scope: global

  # What files your app opens, and how it is discovered
  mime-types:
    - pattern: application/json
      mode: edit
      priority: 200

  # Bundled JSON Schemas etc. — referenced manifest-relative so they resolve after install
  entry-points:
    - mime-types:
        - pattern: application/vnd.acme.report+json
          json-schema:
            source: ./schemas/report.schema.json

  permissions:
    - node.file.read          # request the FEWEST scopes you actually use

  sandbox:
    allow-scripts: true
    allow-same-origin: true
    allow-popups: false
    allow-forms: true

  # Only if your app signs users in
  oauth:
    client-type: public
    redirect-uris:
      - https://app.acme.example/auth/callback

packaging:
  publisher: acme                          # your publisher name
  files:                                   # payload globs, relative to this manifest
    - "schemas/**/*.json"
  encryption: none

Manifest-relative references

Anything selected by packaging.files enters the package payload. It installs as a child of your app record unless spec.install[] maps it elsewhere, so child resources should be referenced with ./… (json-schema.source: ./schemas/report.schema.json). Absolute workspace paths do not survive packaging. If you omit files, the packer derives payload from manifest-relative schema source values and spec.install[].from globs.

See the app manifest reference for every field.

5. Pack and verify

verentis pack                       # → my-app-0.1.0.vpkg  (digested + signed)
verentis verify my-app-0.1.0.vpkg   # checks digests and your developer signature

pack computes a SHA-256 digest for manifest.yaml and every bundled file, signs the digest document (DSSE / Ed25519), and produces a single .vpkg tarball. The registry rejects any upload whose contents don't match its digests.

6. Publish

# First publish creates the listing. Default visibility is PRIVATE — pass --visibility Public
# to list it in the public catalog.
verentis publish my-app-0.1.0.vpkg --visibility Public

Every upload lands as Submitted and enters the moderation queue.

7. Moderation → Published

A reviewer inspects your manifest — the requested permissions, capabilities, sandbox and oauth settings are what they judge, so keep them minimal and legible. On approval the marketplace countersigns your package and the version flips to Published and installable. Rejections come back with notes; fix them and publish a new version (versions are immutable — see Versioning).

8. Try the install

From any workspace you belong to:

verentis install acme/my-app --workspace <workspaceId>

…or open the marketplace, find your app, and Install — the package is pulled into the chosen workspace as a manifest node with your bundled files as children. Opening a matching file now launches your app exactly as it did in local development.

Private distribution

Keep a package Private and grant it to a specific account or workspace (visibility grants, from the developer portal) to distribute proprietary apps through the same pipeline. For sensitive payloads, verentis pack --encrypt seals the bundled files — see Packaging.

Recap

verentis loginverentis publisher createverentis keygen

One-time setup: authenticate, claim your publisher name, register a signing key.

verentis init --kind application and fill packaging.files

Author (or reuse) the manifest; declare the payload to bundle.

verentis packverentis verifyverentis publish --visibility Public

Build the signed .vpkg, sanity-check it, upload it.

Moderation approves and countersigns

Your version becomes Published and installable across workspaces.

Next