ObjectStackObjectStack

Template Manifest

Template Manifest protocol schemas

objectstack.manifest.json — on-disk descriptor for a template / package source tree. Strict projection of CreatePackageRequestSchema (server- managed fields excluded) plus scaffold-time extras (name slug, specVersion, namespace, skills, preview, scaffold, readmePath), with manifestId locally relaxed to OPTIONAL — this file is a source tree, not a publish request (#7319; the field's own TSDoc carries the measurement).

Every shipped objectstack.manifest.json is parsed against this schema by pnpm --filter @objectstack/spec check:template-manifests, so the $schema line those files carry is a verified claim rather than an assertion nothing reads.

Source: packages/spec/src/cloud/template-manifest.zod.ts

TypeScript Usage

import { TemplateManifestSchema } from '@objectstack/spec/cloud';
import type { TemplateManifest } from '@objectstack/spec/cloud';

// Validate data
const result = TemplateManifestSchema.parse(data);

TemplateManifest

objectstack.manifest.json — template / package source descriptor

Properties

PropertyTypeRequiredDescription
displayNamestringDisplay name shown in Studio and Marketplace
descriptionstringoptionalShort package description
visibilityEnum<'private' | 'org' | 'marketplace'>optionalPackage visibility: private = owner org only; org = all envs in owner org; marketplace = public registry
categorystringoptionalPackage category for marketplace discovery (e.g. "crm", "hr", "finance", "devtools")
tagsstring[]optional
iconUrlstringoptional
homepageUrlstringoptional
licensestringoptional
publisherEnum<'objectstack' | 'partner' | 'community' | 'private'>optionalPackage publisher provenance tier
isStarterbooleanoptional
translationsRecord<string, { displayName?: string; description?: string; readme?: string; tagline?: string; … }>optionalLocale-keyed overrides; missing keys fall back to base columns
manifestIdstringoptionalOptional declarative default for the published package id (reverse-domain, e.g. com.acme.crm). Absent on a template source tree: objectstack package publish falls back to --manifest-id and then to a derived local.<slug>. NOT optional on the publish request itself
namestringCLI slug (kebab-case, no namespace prefix)
specVersionstringCompatible @objectstack/spec semver range
namespacestringoptionalScaffold-only: the template’s own metadata namespace, rewritten by create-objectstack at scaffold time and read back as the fallback source for the template’s original namespace. NOT the publish namespace — publish reads that off the compiled artifact’s manifest.namespace (ADR-0048 addendum §A.2)
skillsstring[]optionalSkill ids exercised by this template (for docs / picker)
preview{ screenshots?: string[]; demoUrl?: string }optional
scaffold{ variables?: Record<string, any>; postInstall?: string[] }optional
readmePathstringoptionalPath (relative to manifest) to long-form README

On this page