Landing app

Local build

bun run --cwd apps/landing dev
bun run --cwd apps/landing build

The build reads the workspace's local plugins.json, generates plugin content and copies media, builds the blog and documentation into public/, runs Vite, then creates static app pages in dist/apps/. Deploy the resulting build with the existing Vercel CLI workflow. Generators do not publish or deploy anything.

Plugin-owned content

Each registered local plugin exports landingPage from its root landing.ts. Use the data-only PluginLandingDefinition type in content-types.ts. The entry must not import plugin initialization, persistence, or server modules.

Identity comes from plugins.json and the plugin package manifest. The manifest icon and landing media paths are relative to the plugin root. Store screenshots and GIFs in landing/assets/. scripts/generate-content.ts validates declarations, copies assets to public/plugin-assets/<alias>/<plugin-relative-path>, and writes explicit imports into src/generated/plugin-content.ts. Generated files are not hand-maintained. All UI and static app generators consume that same registry. assetAliases preserves established /screenshots/... URLs for published posts: development maps them to the namespaced copy, and static app generation copies them into the corresponding dist/ path. Their source files remain plugin-owned. The generated media and docs directories are recreated on generation, so removed content cannot survive as stale deployed files.

Documentation

Core documents live in the workspace docs/. Plugin documents live in each plugin/module's docs/; local README/architecture documents are included throughout owned module trees. Dependency, profile, build, and upstream vendor trees are excluded; first-party vendor summaries live in plugin-owned docs. The generator excludes the core blog directory, which has its own pipeline.

Use normal relative Markdown links and images. For example, from plugins/todo/docs/usage.md, link to core with [Web renderer](../../../docs/WEB_RENDERER.md); from a plugin root README the equivalent path is ../../docs/WEB_RENDERER.md.

scripts/generate-docs.ts follows linked Markdown files, renders GFM (including tables, task lists, and fenced code), preserves GitHub-style heading anchors, rewrites document links to static website routes, and copies referenced local assets. A missing local link or asset fails the build with its source path. Source Markdown remains readable locally; generated HTML lives in public/docs/ and is copied into the deployed static build.

Landing-owned scripts

Asset generation, static app/docs/blog generation, demo copying, story recording, and IndexNow tools live in scripts/ here. The reusable demo build/runtime remains owned by the main workspace and web app.

Implementation progress: Phase 1 plan.