Install and manage ExpressionEngine add-on ZIP packages directly from the EE 7 control panel.
Author: Javid Fazaeli
License: MIT
Version: 1.1.0
The standard ExpressionEngine add-on installation workflow involves:
- Download a ZIP from a third-party source.
- Unzip it locally.
- Locate the real add-on folder (sometimes nested inside a wrapper folder).
- Upload that folder to
system/user/addons/via FTP or SSH. - Return to the ExpressionEngine control panel to complete the install.
Addon Manager + keeps more of this workflow inside the control panel: upload the ZIP, and the add-on detects the real folder, extracts it into the correct location, and presents the install button — all without touching FTP.
- Upload third-party add-on ZIP packages directly from the control panel.
- Detect the real add-on folder automatically by locating
addon.setup.php, including inside a wrapper folder. - Extract packages into the active add-ons directory.
- Display installed / not installed / update available status for each package.
- Link back into ExpressionEngine's native install, update, settings, and uninstall flow.
- Reject unsafe ZIP paths, including absolute paths and
..path traversal. - Generate package downloads on demand without permanently storing ZIP files.
- Sort not-installed add-ons before installed ones for quick access.
- Show the Settings action only for add-ons that declare a settings page.
- ExpressionEngine 7
- PHP
ZipArchiveextension - A writable add-ons directory (
system/user/addons/) - Control panel access with permission to manage add-ons
- Copy the
addon_installer/folder intosystem/user/addons/. - In ExpressionEngine, open Developer > Add-Ons.
- Find Addon Manager + and click Install.
- Click Settings next to Addon Manager + to open it.
- Go to Addon Manager + > Install ZIP.
- Select a ZIP file and upload it.
- On success, click Install in the notice, or find the add-on on the Packages screen.
The Packages screen shows all detected packages as responsive cards with status badges:
| Badge | Meaning |
|---|---|
| Installed | The add-on is extracted and installed in ExpressionEngine. |
| Not Installed | The add-on is extracted but not yet installed. |
| Update Available | A newer version was uploaded over an existing installed add-on. |
Available actions per card:
- Install — available for not-installed add-ons.
- Update — available when a newer version has been uploaded.
- Settings — available only when the add-on declares a settings page.
- Download — generates a ZIP for any detected add-on on demand.
- Uninstall — (red) available for installed add-ons.
The ZIP should contain one add-on folder named with the add-on short name:
my_addon/
addon.setup.php
upd.my_addon.php
mcp.my_addon.php
...
Wrapper folders are allowed:
downloaded-release/
my_addon/
addon.setup.php
upd.my_addon.php
Loose add-on files at the ZIP root are rejected because the installer cannot infer the destination folder name. Valid add-on folder names use lowercase letters, numbers, and underscores.
- ZIP entries with absolute paths or
..segments are rejected before extraction. - Only files inside the detected add-on folder are extracted.
- The add-on does not execute or evaluate uploaded PHP files during extraction.
- ExpressionEngine's own permission system controls who can access the control panel module.
- Do not grant control panel access to untrusted users — extracted add-on code runs with the same privileges as any other installed add-on.
- Only ZIP archives are supported;
.tar.gzand other formats are not. - Addon Manager + does not publish or fetch packages from a remote registry; all packages must be uploaded manually.
- The download feature regenerates ZIPs from the current on-disk files, not from the original uploaded archive.
Upload screen showing ZIP Support, Add-ons Folder, and Maximum ZIP Size status cards, the file picker, and the overwrite option.
Coming soon: package cards screen.
Coming soon: update / install / settings actions.
- Remote package registry / URL install
- Bulk install from a ZIP containing multiple add-ons
- Improved version conflict UI
See CHANGELOG.md for a full version history.
Additional project documentation lives in the wiki/ directory:
Run PHP lint after editing PHP files:
for f in *.php ControlPanel/*.php ControlPanel/Routes/*.php Service/*.php views/*.php; do php -l "$f" || exit 1; doneAGENTS.md is local development guidance and is intentionally not part of this repository's public documentation.
Remove this section after completing repo setup.
Set the GitHub description to:
Install and manage ExpressionEngine add-on ZIP packages directly from the EE 7 control panel.
Add these topics: expressionengine expressionengine-addon ee7 cms php addon-manager zip-installer control-panel developer-tools
MIT. See LICENSE.
