stellarwp / harbor
A library that integrates a WordPress product with the Liquid Web licensing system.
Requires
- php: >=7.4
- ext-json: *
- nyholm/psr7: ^1.0
- psr/http-client: ^1.0
- psr/http-factory: ^1.0
- psr/http-message: ^1.1
- stellarwp/container-contract: ^1.0
- stellarwp/licensing-api-client-wordpress: ^2.0
Requires (Dev)
- dealerdirect/phpcodesniffer-composer-installer: ^1
- dpanta94/phpstan-containers: ^0
- exussum12/coverage-checker: ^1.1
- lucatume/codeception-snapshot-assertions: *
- lucatume/di52: ^3
- lucatume/wp-browser: *
- php-stubs/wp-cli-stubs: ^2
- phpcompatibility/phpcompatibility-wp: ^2
- phpspec/prophecy: *
- phpspec/prophecy-phpunit: *
- phpstan/phpstan: ^2
- phpunit/phpunit: *
- stellarwp/coding-standards: ^2
- szepeviktor/phpstan-wordpress: >=1.0
- wp-cli/wp-cli: ^2
This package is auto-updated.
Last update: 2026-05-01 17:19:30 UTC
README
Installation
It's recommended that you install Harbor as a project dependency via Composer:
composer require stellarwp/harbor
We actually recommend that this library gets included in your project using Strauss.
Luckily, adding Strauss to your
composer.jsonis only slightly more complicated than adding a typical dependency, so checkout our strauss docs.
Initialize the library
Initializing the Harbor library should be done within the plugins_loaded action, preferably at priority 0.
use LiquidWeb\Harbor\Config; use LiquidWeb\Harbor\Harbor; add_action( 'plugins_loaded', function() { /** * Configure the container. * * The container must be compatible with stellarwp/container-contract. * See here: https://github.com/stellarwp/container-contract#usage. * * If you do not have a container, we recommend https://github.com/lucatume/di52 * and the corresponding wrapper: * https://github.com/stellarwp/container-contract/blob/main/examples/di52/Container.php */ $container = new Container(); // Use a plugin basename constant defined in your main plugin file, // e.g. define( 'MY_PLUGIN_BASENAME', plugin_basename( __FILE__ ) ) Config::set_plugin_basename( MY_PLUGIN_BASENAME ); Config::set_container( $container ); Harbor::init(); }, 0 );
Translation
Package is using __( 'Invalid request: nonce field is expired. Please try again.', '%TEXTDOMAIN%' ) function for translation. In order to change domain placeholder '%TEXTDOMAIN%' to your plugin translation domain run
./bin/stellar-harbor domain=<your-plugin-domain>
or
./bin/stellar-harbor
and prompt the plugin domain You can also add lines below to your composer file in order to run command automatically
"scripts": { "stellar-harbor": [ "vendor/bin/stellar-harbor domain=<your-plugin-domain>" ], "post-install-cmd": [ "@stellar-harbor" ], "post-update-cmd": [ "@stellar-harbor" ] }
Registering a plugin
Harbor discovers your plugin's embedded key automatically by scanning active plugins for a file named LWSW_KEY.php in the plugin root. No filter registration is required. See the Harbor Integration Guide for more details.
Changelog
This project uses @stellarwp/changelogger to manage its changelog. All notable changes are tracked via changelog entry files in the changelog/ directory.
To add a new changelog entry:
bunx @stellarwp/changelogger add
To compile changelog entries into changelog.txt:
bunx @stellarwp/changelogger write --overwrite-version <version>
Releasing
- Run the Release Prep workflow (
Actions → Release Prep → Run workflow). Supply the target branch, version (e.g.1.2.0), and the release date (e.g.2026-04-29). The workflow bumps theVERSIONconstant, compiles the changelog, and opens a PR automatically. - Review and merge the PR.
- Create a GitHub Release with a new tag in the format
vX.X.Xtargeting the merge commit.
Documentation
Start with Harbor Overview for the full architecture.
Subsystems
- Licensing — Key discovery, API responses, validation workflows, caching.
- Catalog — Product families, tiers, features, the Commerce Portal API.
- Features — Feature types, resolution, strategies, Manager API.
- Cron — Scheduled refresh of catalog and licensing data.
- Frontend — React app, @wordpress/data store, component hierarchy, CSS scoping.
- Notices — Admin notices, legacy license warnings, persistent dismissal.
Architecture
- Unified License Key — Key model, seat mechanics, system boundaries.
- Fat Leader / Thin Instance — Leader election, cross-instance hooks.
- Conventions — Naming conventions for namespaces, packages, identifiers.
API Reference
- REST: License — License endpoints.
- REST: Catalog — Catalog endpoints.
- REST: Features — Feature endpoints.
- REST: Legacy Licenses — Legacy license endpoints.
- Liquid Web Licensing v1 — External licensing API consumed by Harbor.
Guides
- Integration Guide — How to integrate your plugin with Harbor.
- CLI Commands — WP-CLI commands for feature management.
- Testing — PHP tests with Codeception/
slic; E2E tests with Playwright/wp-env.