composer.json is both a Composer manifest and Aikeedo’s metadata. Plugin\Domain\Context parses it at boot, and the heyaikeedo/composer installer reads it during installation.
Complete example
composer.json
Required fields
A package that breaks any of these rules is rejected withInvalidPluginComposerJsonFileException and never boots.
string
required
Either
aikeedo-plugin or aikeedo-theme. It decides where the installer puts the package and how Aikeedo treats it.string
required
The Composer package name,
vendor/package. It must match the installation directory, extra/extensions/{vendor}/{package}.string
required
Every plugin and theme must require the installer package, normally
"^1.0.0". Use "^1.2.0" if you rely on object entries in extra.public.string
required
Fully qualified name of the class that implements
Plugin\Domain\PluginInterface. Escape backslashes in JSON: "Acme\\Hello\\Plugin". The legacy spelling extra.entry_class is still accepted; prefer entry-class. Required for plugins, optional for themes.object
required
Maps your namespace to
src/, so Composer can load the entry class. Required whenever the package ships PHP.Metadata
string
Semantic version, for example
1.2.0. Installing from an archive runs composer require <name>:<version>, so keep it accurate and raise it with every release.string
Shown in the admin plugins list. Aikeedo reads the top-level
description, not extra.description.string
Your product or documentation URL.
string
Release date, for example
2026-09-15, parsed as the package’s release timestamp.string | string[]
SPDX identifier or your own license name.
object[]
Each entry may have
name, email, homepage and role.object
Any of
chat, docs, email, forum, irc, issues, rss, source and wiki. They’re shown as support links.The extra block
string
Display name in the admin panel. Falls back to the package name.
string
Short one-line summary.
string
URL of a logo image.
string
URL of an icon image.
string
Where the plugin’s name links to in the admin plugins list, for example
/admin/settings/hello. The link appears only while the plugin is active. Point it at your settings page.string
default:"inactive"
active, inactive or failed. Aikeedo owns this value: installing sets it to inactive, and activating or deactivating writes the new value back into this file. Ship your package with inactive.array
Files and directories to publish to the web root. See Public assets for the entry formats.
string
The Aikeedo versions your plugin supports, for example
">=5.0.0". This is informational: the application doesn’t enforce it, so check the version yourself if your code depends on it.Dependencies
Declare third-party libraries inrequire as usual:
Themes
Themes use the same file with two differences:type is aikeedo-theme, and extra.entry-class is optional, since a theme can be templates only. extra.status has no effect for themes, because the active theme is the one selected in the admin panel. See the theme manifest.
Validation checklist
The directory path matches
name.type is aikeedo-plugin.require includes heyaikeedo/composer.extra.entry-class points at a class that implements PluginInterface.autoload.psr-4 maps that namespace to src/.version is set and increases with each release.