---
title: Installation
---

Install the standard as a WordPress plugin, or install the development toolchain in a checkout. Generated plugins keep these same commands after the identity is renamed.

## Install the plugin

<!-- wp:docspress/callout {"tone":"note","title":"This repository is the standard, not a product","content":"<p>README.md says generated plugins replace this install section with their own notes. Use these commands when you are installing Plugin Scaffold itself or a checkout that has not been renamed yet.</p>","collapsible":false} /-->

Composer package name: `linchpin/plugin-scaffold`. The plugin header also allows uploading a release zip.

<!-- wp:docspress/terminal-session {"title":"Require the package","shell":"bash","prompt":"$","command":"composer require linchpin/plugin-scaffold","output":""} /-->

This repository's `composer.json` registers `https://packagist.linchpin.com` in addition to the default Packagist. House development packages such as `linchpin/coding-standards` resolve through that repository.

A GitHub Release attaches `plugin-scaffold.zip` after Plugin Check passes. Upload that zip through WordPress when you are not installing from Composer.

The plugin will not boot without an autoloader. `plugin-scaffold.php` requires `vendor/autoload.php` when that file exists. If the `Bootstrap` class is missing, administrators who can activate plugins see:

<!-- wp:docspress/colorful-code {"language":"plaintext","filename":"WordPress admin notice","code":"Plugin Scaffold could not load its dependencies. Run composer install inside the plugin directory, or install a release build.","showLineNumbers":false,"caption":"Exact string from plugin_scaffold_missing_autoloader_notice()."} /-->

## Development checkout

Prerequisites: PHP 8.3, Node from `.nvmrc` (`24.13.0`), and the tools `scripts/build.sh` requires when you build a zip (`npm`, `composer`, `zip`, `rsync`, `php`).

<!-- wp:docspress/flow {"start":1,"steps":[{"title":"Install PHP dependencies","content":"<p>From the repository root, run <code>composer install</code>. This pulls runtime and development packages, including the Linchpin coding standards from packagist.linchpin.com.</p>"},{"title":"Install JavaScript dependencies","content":"<p>Run <code>npm install</code>. The lockfile is npm. CI uses <code>npm ci</code>.</p>"},{"title":"Build the admin bundle","content":"<p>Run <code>npm run build</code>. Root webpack compiles <code>src/admin/index.js</code> to <code>build/admin.js</code> and <code>build/admin.asset.php</code>. The distributable zip asserts both files exist.</p>"},{"title":"Run the gates","content":"<p>Run <code>composer test</code> for every static PHP gate plus the unit suite. See <a href=\"../development/quality-gates.md\">quality gates</a>.</p>"}]} /-->

<!-- wp:docspress/terminal-session {"title":"README development commands","shell":"bash","prompt":"$","command":"composer install && npm install && npm run build && composer test","output":""} /-->

`npm install` runs `prepare`, which runs `husky` and installs the commit-msg and pre-commit hooks.

If you applied the [blocks overlay](../overlays/blocks.md), also install and build the nested `blocks/` workspace. That overlay merges extra root scripts, including `install:all` and `build:all`.

## What the zip contains

`bash scripts/build.sh` writes `build/plugin-scaffold/` and `build/plugin-scaffold.zip`. It is the same command the release workflow, Plugin Check, and a local developer run. Details are on [build and release](../development/build-and-release.md).

<!-- wp:docspress/result {"status":"success","title":"A checkout is ready when","content":"<p><code>vendor/autoload.php</code> exists, <code>build/admin.js</code> exists, and <code>composer test</code> passes. WordPress then loads <code>plugin-scaffold.php</code> on <code>plugins_loaded</code>.</p>","meta":"plugin-scaffold.php"} /-->
