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
| Field | Type | Required? | Description |
|---|---|---|---|
name | string | yes | Human-readable name shown in navigation and the package registry. |
slug | string | yes | URL segment and collection-name prefix. Must match the last segment of the npm package name. |
version | string | yes | Informational. Keep in sync with package.json. |
description | string | yes | One-sentence summary shown in the package registry. |
routes.directory | string | no | Folder of org-scoped screens, re-exported under app/a/[orgSlug]/<slug>/. Convention: 'screens'. |
publicRoutes.directory | string | no | Folder of public top-level screens, re-exported under app/<path>. Convention: 'public-screens'. |
nav.label | string | if nav set | Text for the rail entry. |
nav.icon | string | if nav set | Lucide icon name. |
nav.order | number | no | Sort priority; lower comes first. |
nav.shortcut | string | no | Single-letter keyboard shortcut. Must be unique across installed packages. |
migrations.directory | string | no | Folder of PocketBase migration JS files. Convention: 'pb-migrations'. |
hooks.directory | string | no | Folder of PocketBase JS hooks. Convention: 'pb-hooks'. |
collections.register | string | no | Subpath (no extension) to the module exporting registerCollections. |
collections.types | string | no | Subpath (no extension) to the module exporting {PascalSlug}Schema. |
sidebar.component | string | no | Subpath 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.component | string | no | Subpath to a provider component wrapping the package’s routes. |
settings | Array<{slug, component, label}> | no | Personal Settings panel contributions. Each entry is a link + component pair. |
settings[].slug | string | if settings set | URL segment under /a/[orgSlug]/settings/. Must be unique across installed packages. |
settings[].component | string | if settings set | Subpath to the panel component. |
settings[].label | string | if settings set | Link text in the settings sidebar. |
seed.script | string | no | Subpath to a module default-exporting an async seed function. |
tests.directory | string | no | Folder of Playwright specs. Convention: 'tests'. Vitest globs tests automatically. |
server.package | string | no | Subdirectory containing a Go module. Convention: 'server'. |
server.module | string | no | Go module path declared in that subdirectory’s go.mod. Namespace as tinycld.org/packages/<slug>. |
help.directory | string | no | Folder of <id>.md help topics. Convention: 'help'. |
build.script | string | no | Subpath 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. |
dependencies | string[] | no | Slugs 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