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 login → verentis publisher create → verentis 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 pack → verentis verify → verentis publish --visibility Public
Build the signed .vpkg, sanity-check it, upload it.
Moderation approves and countersigns
Your version becomes Published and installable across workspaces.