Docs
WordPress and Laravel
Create WordPress and Laravel sites in one step, run wp-cli, Composer and Artisan, and start sites from blueprints.
New WordPress site
One command creates a working WordPress site:
covo wordpress blog
Covo creates the folder (~/Sites/blog by default; it must be new or empty), copies WordPress, adds the site at https://blog.localhost:8443, creates a database blog with its own MySQL user, writes wp-config.php and runs the installation. MySQL must be on and Covo running.
You can choose the folder, PHP version, title and administrator:
covo wordpress blog --path ~/Work/blog --php 8.2 --title "Client Blog" \
--admin-user andrea --admin-email me@example.com
covo wordpress blog --domain blog.covo.test --group Clients/Acme --ini memory_limit=1G
The administrator password is generated, shown once and not stored, so copy it when it appears. If any step fails, Covo removes everything it created. A folder that already existed is emptied, not deleted.
In the app, use + → New WordPress Site… (or New Site… → WordPress).
wp-cli
covo wp <site> runs wp-cli for a site, with the same PHP version the site uses and Covo’s php.ini, so it reaches Covo’s MySQL without extra setup:
covo wp blog plugin list
covo wp blog user update admin --prompt=user_pass
covo wp blog -- search-replace old.example.com blog.localhost:8443
Everything after the site name goes to wp-cli unchanged, and its output and exit code come back unchanged. Because of that, covo wp has no --json envelope; use wp-cli’s own --format=json where it offers one. wp-cli’s cache and packages are kept inside Covo’s folder, not in ~/.wp-cli.
Blueprints
A blueprint is a JSON template for WordPress sites. It can set:
| Field | What it does |
|---|---|
wordpress |
WordPress version and language (locale) |
themes, plugins |
from wordpress.org by slug (optionally at a version), a zip URL over HTTPS, a GitHub owner/repo at a branch, tag or commit, or a git URL |
options |
permalinks, timezone, removing the sample content, other WordPress options |
constants |
values written into wp-config.php |
mu_plugins |
must-use plugin files |
Every field except name is optional, and unknown fields are refused. Git URLs only work if Apple’s Command Line Tools are installed; Covo never installs them.
Using blueprints
covo blueprint import agency.json # add a blueprint
covo wordpress shop --blueprint agency # new site from it
covo blueprint apply agency shop --dry-run # see what it would install
covo blueprint apply agency shop # apply to an existing site
covo blueprint save shop agency-2 # save a site as a blueprint
covo blueprint list
covo blueprint export agency agency.json
Applying a blueprint to an existing site takes a snapshot first (see Snapshots and sync). If something fails, the error names the snapshot to restore. Themes and plugins already in the site are left as they are. When a new site from a blueprint fails, the whole site is removed again.
covo blueprint save keeps wordpress.org themes and plugins at their installed versions. Others are reported as warnings, so add their url or github by hand. Constants are not saved, since they can hold secrets.
For private GitHub repositories, store a token with covo blueprint github-token. It is kept in your login keychain and sent only to api.github.com.
In the app: New Site → WordPress → Blueprint; a WordPress site’s Advanced → Blueprints to apply or save; Settings → Blueprints to import, export, delete and set the GitHub token.
Checksums on first use
A blueprint installs third-party code, so Covo asks before applying it (or pass --yes). Covo downloads every theme and plugin itself and records its SHA-256 the first time it sees that exact source: a wordpress.org version, a GitHub commit or a zip URL. If the same source later delivers different content, Covo stops before installing it. To accept the new content, pass --accept-changes (in the app, “Accept Changes and Apply”). List what Covo has recorded with:
covo blueprint sources
Laravel projects
Add a Laravel project folder (or its public folder) like any other site. Covo recognises Laravel from artisan and laravel/framework in composer.json, serves public/ and runs tools in the project folder. The site detail shows “Laravel” and the project folder.
New Laravel project
covo laravel shop
covo laravel shop --database sqlite --path ~/Work/shop --php 8.3
Covo runs composer create-project laravel/laravel, adds the site and fills in .env: APP_NAME, APP_URL with the site’s address, the database and Mailpit’s SMTP port when mail is on. When MySQL is running you get a new database with its own user; otherwise Laravel’s SQLite file. Use --database new or --database sqlite to choose, and --engine pgsql for a PostgreSQL database (see Databases). With a database, Covo also runs artisan migrate. Laravel needs PHP 8.2 or newer. No queue worker or scheduler is started.
If a step fails, everything created is removed. In the app: + → New Site… → Laravel.
Composer and Artisan
covo composer shop require guzzlehttp/guzzle
covo artisan shop migrate
covo artisan shop make:model Post -m
Both run with the site’s exact PHP version and Covo’s php.ini, including PHP processes that Composer scripts start. Arguments, output and exit code pass through unchanged, as with covo wp. Sites on PHP older than 7.3 get Composer 2.2 LTS. Composer’s home and cache live inside Covo’s folder, not in ~/.composer.
In the app, open the site’s Advanced section and choose Run….