---
title: Installation
---

Mantle installs like any other WordPress plugin. A packaged release ships with its autoloader already built; a source checkout needs Composer.

## Choose an installation method

<!-- wp:docspress/fields {"title":"Installation methods","description":"Pick the method that matches how you obtained Mantle.","fields":[{"name":"Release zip","type":"string","required":false,"defaultValue":"","description":"Upload through <strong>Plugins → Add New → Upload Plugin</strong>. The zip already contains <code>vendor/</code>, so no build step is required.","values":"","deprecated":false},{"name":"Source checkout","type":"string","required":false,"defaultValue":"","description":"Clone the repository into <code>wp-content/plugins/</code> and run <code>composer install</code>. Required for development.","values":"","deprecated":false},{"name":"Must-use plugin","type":"string","required":false,"defaultValue":"","description":"Place the plugin directory in <code>wp-content/mu-plugins/</code> for site-wide activation that cannot be switched off from the Plugins screen.","values":"","deprecated":false}],"searchable":false,"compact":true} /-->

## Install from a release zip

1. Download the release zip from the [Releases page](https://github.com/linchpin/mantle/releases).
2. In WordPress admin, go to **Plugins → Add New → Upload Plugin**.
3. Upload the zip and choose **Install Now**, then **Activate**.

Activation redirects the activating user to the setup wizard. See [First run](first-run.md).

## Install from source

A source checkout has no `vendor/` directory, so the Composer autoloader must be built before the plugin can boot.

<!-- wp:docspress/terminal-session {"title":"Clone and build","shell":"bash","prompt":"$","command":"cd wp-content/plugins\ngit clone https://github.com/linchpin/mantle.git\ncd mantle\ncomposer install","output":""} /-->

If `composer install` has not run, Mantle cannot find `\\Mantle\\Core\\Bootstrap` and shows an admin notice instead of booting:

<!-- wp:docspress/result {"status":"error","title":"Mantle bootstrap class not found","content":"<p>The plugin renders this admin notice when <code>includes/Core/Bootstrap.php</code> cannot be loaded. Reinstall the plugin, or run <code>composer install</code> in the plugin directory if you are working from a source checkout.</p>","meta":"admin notice"} /-->

### Build the admin interface

The React admin dashboard is compiled into `build/`. A release zip ships with `build/` already populated; a source checkout does not.

<!-- wp:docspress/code-tabs {"tabs":[{"label":"Production","language":"bash","filename":"Terminal","code":"npm install\nnpm run build"},{"label":"Development","language":"bash","filename":"Terminal","code":"npm install\nnpm run start"}],"showLineNumbers":false,"caption":"npm run start rebuilds on change; npm run build produces the minified production bundle."} /-->

## Install as a must-use plugin

Place the whole plugin directory in `wp-content/mu-plugins/`. WordPress does not auto-load plugins from subdirectories of `mu-plugins/`, so add a loader file alongside it:

<!-- wp:docspress/colorful-code {"language":"php","filename":"wp-content/mu-plugins/mantle-loader.php","code":"<?php\n/**\n * Load Mantle from the mu-plugins subdirectory.\n */\nrequire_once WPMU_PLUGIN_DIR . '/mantle/mantle.php';","highlightedLines":"5","showLineNumbers":true,"caption":"Must-use plugins in subdirectories need an explicit require.","copyMode":"all","diffMode":"none"} /-->

<!-- wp:docspress/callout {"tone":"note","title":"Activation hooks do not fire for must-use plugins","content":"<p>WordPress never calls <code>register_activation_hook</code> for a must-use plugin, so the <code>mantle_activated</code> flag is never set and the setup wizard is not offered automatically. Navigate to <code>admin.php?page=mantle&view=setup</code> directly to complete setup.</p>","collapsible":false} /-->

## Verify the installation

Confirm the plugin is active and its settings schema is intact.

<!-- wp:docspress/terminal-session {"title":"Verify","shell":"bash","prompt":"$","command":"wp plugin list --name=mantle --field=status\nwp mantle settings audit","output":"active\nOption: mantle\nSchema keys: 102\nSaved keys: 102\nMissing schema keys: 0\nOrphaned saved keys: 0\n\nSuccess: Settings audit passed. Saved keys match the registered schema."} /-->

The key count reflects the schema registered by whichever modules are present, so it grows if you add modules that register their own settings. What matters is that **Missing schema keys** and **Orphaned saved keys** are both `0`. See [`wp mantle settings audit`](../reference/cli.md) for the flags that repair a mismatch.

## Next steps

- [Configuration](configuration.md) — the constants Mantle reads at boot.
- [First run](first-run.md) — the setup wizard and enabling modules.
