Manifest schema

This page is the exhaustive reference for the manifest object every package default-exports from manifest.ts. For a task-oriented walkthrough, see Manifest; for the narrative around individual fields, see the other pages under Anatomy.

Fields

FieldTypeRequired?Description
namestringyesHuman-readable name shown in navigation and the package registry.
slugstringyesURL segment and collection-name prefix. Must match the last segment of the npm package name.
versionstringyesInformational. Keep in sync with package.json.
descriptionstringyesOne-sentence summary shown in the package registry.
routes.directorystringnoFolder of org-scoped screens, re-exported under app/a/[orgSlug]/<slug>/. Convention: 'screens'.
publicRoutes.directorystringnoFolder of public top-level screens, re-exported under app/<path>. Convention: 'public-screens'.
nav.labelstringif nav setText for the rail entry.
nav.iconstringif nav setLucide icon name.
nav.ordernumbernoSort priority; lower comes first.
nav.shortcutstringnoSingle-letter keyboard shortcut. Must be unique across installed packages.
migrations.directorystringnoFolder of PocketBase migration JS files. Convention: 'pb-migrations'.
hooks.directorystringnoFolder of PocketBase JS hooks. Convention: 'pb-hooks'.
collections.registerstringnoSubpath (no extension) to the module exporting registerCollections.
collections.typesstringnoSubpath (no extension) to the module exporting {PascalSlug}Schema.
sidebar.componentstringnoSubpath to a component rendered in the secondary sidebar when this package is active. Omit sidebar entirely and the workspace renders no sidebar container - the package’s screens get the full viewport width next to the nav rail (@tinycld/calc ships this way).
provider.componentstringnoSubpath to a provider component wrapping the package’s routes.
settingsArray<{slug, component, label}>noPersonal Settings panel contributions. Each entry is a link + component pair.
settings[].slugstringif settings setURL segment under /a/[orgSlug]/settings/. Must be unique across installed packages.
settings[].componentstringif settings setSubpath to the panel component.
settings[].labelstringif settings setLink text in the settings sidebar.
seed.scriptstringnoSubpath to a module default-exporting an async seed function.
tests.directorystringnoFolder of Playwright specs. Convention: 'tests'. Vitest globs tests automatically.
server.packagestringnoSubdirectory containing a Go module. Convention: 'server'.
server.modulestringnoGo module path declared in that subdirectory’s go.mod. Namespace as tinycld.org/packages/<slug>.
help.directorystringnoFolder of <id>.md help topics. Convention: 'help'.
build.scriptstringnoSubpath to a TS module the generator runs before emitting route re-exports. Use for artifacts the bundler can’t produce on its own (e.g. an embedded webview bundle). The dev launcher re-runs it in watch mode for the duration of the session.
dependenciesstring[]noSlugs of other packages this one expects to be installed. Metadata only; not enforced at build time.

All the *.directory and *.component / *.script fields are paths relative to the package root. directory values point at a folder; component and script values are subpaths without the file extension.

TypeScript interface

The source-of-truth interface lives in the app shell’s scripts/generate-packages.ts:

interface PackageManifest {
    name: string
    slug: string
    version: string
    description: string
    routes?: { directory: string }
    publicRoutes?: { directory: string }
    nav?: { label: string; icon: string; order?: number; shortcut?: string }
    migrations?: { directory: string }
    hooks?: { directory: string }
    collections?: { register: string; types: string }
    sidebar?: { component: string }
    provider?: { component: string }
    settings?: { slug: string; component: string; label: string }[]
    seed?: { script: string }
    tests?: { directory: string }
    server?: { package: string; module: string }
    help?: { directory: string }
    build?: { script: string }
    dependencies?: string[]
}

Annotated example

const manifest = {
    name: 'Example',
    slug: 'example',
    version: '0.1.0',
    description: 'An example package',

    routes: { directory: 'screens' },
    publicRoutes: { directory: 'public-screens' },

    nav: {
        label: 'Example',
        icon: 'box',
        order: 20,
        shortcut: 'e',
    },

    migrations: { directory: 'pb-migrations' },
    hooks: { directory: 'pb-hooks' },

    collections: {
        register: 'collections',
        types: 'types',
    },

    settings: [
        { slug: 'example', component: 'settings/example', label: 'Example settings' },
    ],

    sidebar: { component: 'sidebar' },
    provider: { component: 'provider' },

    seed: { script: 'seed' },
    tests: { directory: 'tests' },

    server: { package: 'server', module: 'tinycld.org/packages/example' },

    build: { script: 'build' },

    // dependencies: ['other-package-slug'],
}

export default manifest