Basecoat is a starter, not a theme you ship. It is a complete standalone block
theme — theme.json, templates, parts, the editor styles — built so a new
project begins from one consistent set of choices instead of a blank slate.
It is for building block themes on. The conventions it carries are the ones the other themes here follow, which is why it is the reference they are read against.
- WordPress 6.8+ (tested up to 6.8)
- PHP 8.1+
- Version 2.0.1
Basecoat is a starting point, so it is used once per project rather than installed from a directory:
- Copy this directory into
wp-content/themes/under the name the new site will use, and edit theTheme Name:,Text Domain:and version headers instyle.css. Rename the text domain's.potinlanguages/to match. - Run
composer install,npm installandbin/harness setup— see the Development section below. - Activate it.
To try it as it stands, copy the directory in and activate it: it needs no parent and nothing else installed.
- PHP 8.1+ · WordPress 6.8+ · Composer · Node.js LTS + npm
- Docker. Every command runs through
bin/harness, which resolves the backend for you — DDEV first, then LocalWP, then the host. Nothing needs installing.
composer install
npm install
bin/harness setup # one-time: dependencies and this project's toolchain| Command | What it does |
|---|---|
npm run test:all |
every linter, and the suites the project has |
npm run build:all |
test:all, then the .pot, then the bundle |
composer run verify:php |
the pre-push gate: standards and static analysis |
composer run verify:all |
the same, plus the integration suite where the project has one |
composer run lint:wpcs / npm run lint / npm run lint:css |
WPCS, ESLint, Stylelint — the :fix variants rewrite |
composer run lint:pcp |
Plugin Check, where the project ships through WordPress.org |
composer run make:pot |
regenerate languages/basecoat.pot |
npm run zip |
the distributable archive |
Tests. This project is a theme, and the harness carries no test layer for themes: test, integration, coverage, mutation, counterfactual, test:js, and e2e each print one sentence and exit 0. A tests/ directory the project already has stays in its repository and is not run; lint, the build and the hooks are unchanged.
Assets: npm start to watch, npm run build for a one-shot bundle.
Anything without a script above goes through the runtime directly:
bin/harness doctor # backend, tools, graft, manifest — run this first
bin/harness help # every commandNever call php, composer, node, npm or wp directly. The backend is
resolved per project, and a direct call fails in a way that looks like a broken
project rather than a missing environment.
Basecoat is developed in this repository. Read AGENTS.md first — it carries
the project facts, the conventions and the gates, and it is where the
block-theme shape is written down for the themes built from this one.
