Modules come from two sources: bundled modules, shipped inside the binary as part of the panel’s own codebase, per
ADR-0009, and external modules, installed
alongside it. External modules are Composer packages with dependencies of their own,
some of which the panel already provides. The panel depends on composer/composer, added for installing them.
External modules are Composer packages of type tgp-module, installed into a separate Composer project in the
modules directory, with its own composer.json and vendor/. The panel drives Composer as a PHP library rather than
running it as a standalone tool, and includes the modules autoloader alongside its own.
Composer as a standalone tool. Using it as a library instead gives full programmatic control over repository resolution and installation.
No other way of installing modules was weighed.
Easier:
Harder:
provide block will need generating from the panel’s own lock file, and keeping in sync
whenever modules are added, removed or updated.Constrained:
extra.tgp in each module’s
composer.json.created and decided, the reason for using Composer as a library, the separate Composer project, the modules
autoloader and the provide block.tgp-module, and metadata
under extra.tgp.composer.json at 7fad8cd, the initial
commit: composer/composer, added for installing modules before the design was written.composer/composer was updated to 2.10.3 because 2.10.2 is affected by CVE-2026-84361, and 2.10.3
declares ext-filter and ext-hash, which the single-binary build will need to compile in.