# Codeless `.bnp` — Declarative Plugins (WO-WZ-020) A **codeless `.bnp`** is a plugin artifact with **no `plugin.wasm`**: pure declaration the host runs. No wazero compile, no instance pool, no capability binding — zero guest code ever executes. This is the end-state of "injection, not reliance" for themes, content sites, and template-only block packs: the plugin is *data the host runs*, not a program that links a library. No Go, no `block/core` dependency, no toolchain beyond the `ninja` CLI. ## The classifier — exactly one rule `ninja plugin build` classifies by repo shape: - **No Go source at the repo root → codeless.** The manifest is synthesized from `plugin.mod` + the declarative files below; the artifact packs without a wasm. `--codeless` asserts this and fails if Go is present. - **Go source → wasm**, exactly as before. A converted repo DELETES its Go — partial conversions keep a smaller wasm and still ship `blocks/` + `seed/` alongside it (both artifact kinds carry the declarative dirs). ## The declarative / logic split **Codeless-expressible** (declaration or host-rendered template): - Blocks: a `.ninjatpl` template + declared **data providers** (the CMS's own provider set — `posts`, `site`, `menus`, `authors`, … ADR 0018). The host fetches, the engine renders. Defined in `blocks/blocks.yaml` — the SAME manifest-FS layout core builtin block definitions use. - Master pages, theme presets, fonts, CSS manifest, icon packs, settings schema (`manifest.yaml`), assets (host-served), migrations (host-run Goose), seed data (`seed/seed.json`, applied via the WO-WZ-019 provisioner). - **Template overrides** (WO-WZ-021): theme-scoped re-renders of builtin blocks. Declared in `manifest.yaml` as `template_overrides: [{template: , block: }]`; the source lives at `templates/overrides/