Documentation

Addon Expert installs, updates, and tracks ExpressionEngine add-ons from the control panel — ZIP uploads, GitHub releases, one-click updates, supply-chain checks, and compatibility overrides. This covers every screen and how the pieces fit.

Install Addon Expert

Copy the addon_expert/ folder into system/user/addons/, then open Developer → Add-Ons in the control panel, find Addon Expert, and click Install. Its screens then live under Developer → Add-Ons → Addon Expert: Install ZIP, Packages, Releases, Audit Log, and Settings.

Upgrading from the original Addon Manager + (addon_installer)? Install Addon Expert and your config — GitHub mappings, trust anchors, settings, overrides, and the release cache — is copied across automatically. Confirm it carried over, then uninstall the old add-on.

1. Install from ZIP

Upload an add-on ZIP and Addon Expert detects the real add-on folder from its addon.setup.php and extracts it into the add-ons directory — no FTP.

  • The ZIP may contain a wrapper folder, e.g. vendor-package/my_addon/addon.setup.php; the folder holding addon.setup.php is used.
  • Loose add-on files at the ZIP root are rejected — there's no folder name to install into.
  • The detected folder name must use lowercase letters, numbers, and underscores.
  • Overwrite replaces an existing folder of the same short name.

Inspect before commit

The upload is inspected and scanned before anything is written. A compatible package extracts and installs straight through. An incompatible one (declaring a newer PHP/EE than your server) is held on a confirm screen showing the unmet requirement, a compatibility-scan verdict, and a one-click Force or Cancel — so a wrong-environment package never silently lands, and you never re-select the file. See Compatibility & force override.

2. Packages

Every detected package appears as a card. Actions use ExpressionEngine's own install / update / settings / uninstall flow.

BadgeMeaning
Installed / Not InstalledWhether EE currently has the add-on installed.
Update AvailableNewer files are on disk than EE has recorded.
GitHub: vX.Y.Z ↗A newer release exists on the mapped repo — links to it.
⚠ incompatibleThe package's declared PHP/EE requirement isn't met here.
⚠ requirement overrideForce-installed past its requirement; shows the original requirement and the scan verdict from force time.

The Download action exports any detected add-on as a ZIP, generated on demand and not stored.

3. Tracking GitHub releases

Point an add-on at a GitHub repo and Addon Expert polls /releases/latest, compares it to the installed version, and surfaces a pending-update badge plus a sidebar count.

Author-declared

An add-on's addon.setup.php can declare its own source:

'github_repo' => 'owner/repo',

Shown read-only on the Releases screen — no admin action needed.

Admin-mapped

For add-ons whose author didn't declare one, type owner/repo into the Releases row. Saved to system/user/config/addon_expert_mappings.json. A manifest declaration always wins over an admin mapping.

Caching

Results cache for 1 hour; stale entries refresh in parallel when the Releases screen loads. Check for updates forces a full refresh of every mapping. GitHub API calls are unauthenticated — public repos only (60 requests/hour per IP, far above any real site's needs).

4. One-click update & auto-finalize

When a newer release exists, install it in one click. Addon Expert:

  • Picks a download URL — a release asset named after the add-on, then any .zip asset, then the source zipball. Downloads are capped at 100 MB.
  • Safe-extracts into a staging folder (same path checks as the upload flow), locating the add-on subtree even in a wrapper or source zipball.
  • Moves the previous version to a backup under system/user/cache/addon_expert/backups/ — outside the add-ons directory, so EE never tries to load it. One rolling backup per add-on.
  • Invalidates PHP opcache for the new files so the next request runs the new code.

Auto-finalize

After the swap, the EE-side update step (the add-on's upd.php plus the version-row bump) runs automatically the next time you load an Addon Expert screen — so you don't have to go to Developer → Add-Ons and click Update. This applies to manual ZIP uploads too. A banner reports the from→to versions, or "nothing to do" if the version already matched. Toggle it in Settings.

5. Supply-chain protection

A GitHub repo can change hands, or be deleted and re-claimed under the same owner/repo name (RepoJacking). Addon Expert treats every install as a supply-chain decision.

  • On the first install of a mapped add-on it pins the repo's stable numeric identity — owner ID, repo ID, created date — to system/user/config/addon_expert_trust.json.
  • Every install re-fetches that identity from GitHub (bypassing cache) and hard-blocks if it changed. A username rename does not trip it — the numeric ID is stable — only a real ownership transfer or a delete+recreate.
  • The Releases screen shows the trust state per add-on (✓ trusted / ⚠ CHANGED / unverified), with a Reconfirm trust action to accept a legitimate change. Reconfirming is itself audit-logged.

Audit log

Every install, failure, block, trust pin, override, and auto-finalize is written to system/user/cache/addon_expert/install.log (JSONL) and shown on the Audit Log screen — with per-event-type counts, a self-update flag, and grep recipes for the raw file.

6. Compatibility & force override

ExpressionEngine refuses to install an add-on that declares a newer PHP or EE than the server runs. Addon Expert reads the same requires block and surfaces that verdict earlier — before extracting on upload, and before the swap on a GitHub install.

Forcing an over-declared requirement

Sometimes an author sets a conservative baseline the code doesn't actually need. When you choose Override version requirements, Addon Expert first runs a heuristic feature scan of the package's PHP and tells you whether anything newer than your version is actually used:

  • "No PHP 8.3 features detected — appears safe to force."
  • "Uses json_validate() (PHP 8.3) — forcing onto 8.2 will fatal when that code runs."

Forcing patches the add-on's declared requirement so EE accepts it, records the original, flags the add-on with a requirement-override badge, and re-applies the patch on future updates.

Best-effort. The scan reads source patterns; it can't see dynamic calls (call_user_func('json_validate', …)) or eval. Treat it as an informed signal, not a guarantee — and remember that forcing an add-on that genuinely uses newer syntax will fatal at runtime.

7. Settings & CP menu

  • Custom-menu integration — show Addon Expert in the CP Custom menu with a configurable label (default "Addons") and an optional pending-update count, e.g. Addons (3). You add the entry once via Settings → Menu Manager (a core EE page); Addon Expert can't force itself into the menu.
  • Auto-finalize the EE-side update after an install (default on).
  • Lazy refresh of stale release caches when the Releases screen loads (default on).

8. Where data lives

PathContents
system/user/config/addon_expert_mappings.jsonAdmin repo mappings
system/user/config/addon_expert_trust.jsonPinned trust anchors
system/user/config/addon_expert_overrides.jsonRequirement overrides
system/user/config/addon_expert_settings.jsonSettings-screen options
system/user/cache/addon_expert/Release cache, audit log, backups, and held uploads

All of it is plain files on your server — nothing is sent anywhere except the public GitHub API calls described above.

9. Security & requirements

  • Requires ExpressionEngine 7, PHP ZipArchive (uploads) and cURL (GitHub downloads).
  • Absolute paths, drive-letter paths, and .. traversal are rejected before extraction.
  • Uploaded add-on PHP is never executed to read its metadata — it's parsed as text.
  • ExpressionEngine still controls the final install/update step, with its own permission and CSRF checks.
  • Don't grant control-panel access to untrusted users — extracted add-on code runs with full add-on privileges.

Addon Expert is MIT-licensed and developed in the open at github.com/calimonk/ee-addon-expert. It's a maintained fork of Addon Manager + by Javid Fazaeli.