# One word for the thing you install: Module

2026-08-07. Asked for by Ernest, and it settles a split the code has been
carrying since phase 5.

> Extensions in the Admin needs to be changed to Modules, which is where you
> install 3rd party, 1st party, or as I call them 2nd party. Pages, Downloads,
> Forums, Calendar (Events), Blog will be official 1st party modules.

---

## The split that should not exist

Convoro has two words for one idea. `modules/` holds what ships; `extensions/`
holds what somebody installed. They are the same shape — a manifest, a provider
class, routes, migrations, templates — loaded by the same `ModuleManager`,
through the same lifecycle. The only difference is which directory they were
sitting in.

That distinction is real to the engine and meaningless to an administrator.
Forums is a module. A weather widget somebody wrote is a module. Asking a site
owner to hold two vocabularies for one concept buys nothing.

So: **everything is a Module.** What differs is *who made it*, which is the
question people actually ask.

## The three parties

- **Official** — built by Convoro and shipped with it. Forums, Pages,
  Downloads, and later Calendar (Events) and Blog.
- **Partner** — built by us but not part of Convoro. Ernest's "second party".
- **Community** — everybody else.

🚨 **Party is only trustworthy for what shipped.** A module in the release is
official because it arrived in the release; nothing can fake that. A `party`
field in an uploaded manifest is a *claim* — anyone can type `"official"` — so
it must never be the basis of a trust decision, and it is not one here.

The verifiable signal already exists and stays separate: a **signature** against
a configured trusted key. The page shows both, and they say different things.
"Who says they made this" and "who provably did" must not be collapsed into one
badge, because the badge would be lying exactly when it mattered.

So:

| Shown | Source | Trustworthy? |
|---|---|---|
| Official | shipped in the release | yes, structurally |
| Partner / Community | the manifest's `author` | it is a claim |
| Signed by *name* | verified against a trusted key | yes, cryptographically |

## What changes

- **Admin → Extensions** becomes **Admin → Modules**, and lists official
  modules alongside installed ones rather than only the latter.
- Official modules show what they are and whether they are turned on. Ones that
  can be turned off say so; System and the services do not offer it, per
  `2026-08-07-the-application-model.md`.
- Installed modules keep everything they had: version, update state, author,
  signature, enable, disable, uninstall.
- The upload box keeps saying **.zip**, since that is what it now is.

## What does not change

- **The directories.** `modules/` and `extensions/` still mean "shipped" and
  "installed", because that distinction is exactly what makes *official*
  verifiable. Renaming `extensions/` to something else would break every
  install for no gain, and `tools/deploy-dev` excludes it by name.
- **`Convoro\Extensions\` as the namespace** for installed code, for the same
  reason and because renaming it would invalidate every package already built.
- **The CLI verbs.** `ext:install`, `ext:package`, `ext:scaffold` describe the
  packaging pipeline a developer works in, and they read together. A developer
  building one is not the audience for this rename; an administrator installing
  one is.

The word changes where a site owner reads it. It does not change where the
engine has to keep telling shipped and installed apart, because that is the
distinction doing the security work.

## Reference

The job this page does is the one every mature forum has: a single screen that
says what is installed, who made it, whether it is on, and whether an update is
waiting. That comes from having administered them, which is a legitimate source
under ROADMAP.md — the running product as any user experiences it.

🚨 The layout, the copy and the section names are ours. Invision's licence is
revoked and their source is not an input; matching the *job* is competition,
matching their expression is not available. Their vocabulary is "Applications"
and "Plugins" as two separate things, which is the split this note removes.
