Hoof and Harbor
Decentralize your WordPress plugin distribution.
Troy is a suite of plugins that enables independent distribution of plugins and themes outside WordPress.org. Host your own update server, protect user privacy, and maintain full control over your software distribution.
What's Changed
Server:
- Added Composer 2 repository support for Bedrock and other Composer-managed WordPress sites.
- Added a configurable Composer vendor slug to the Setup tab, pre-filled from the site name at install time.
- Added a Composer setup guide modal to the package list view and editor.
- Added "Latest version" column to the plugin list view.
- Added a plugin status guard that requires at least one released version before a plugin can be set to public, unlisted, or protected.
- Added settings save to the Setup tab via REST with change detection.
- Added live slug preview to the package editor showing the download URL and Composer package URL.
- Added "Require" network activation option for packages. The legacy
networkcolumn is migrated and dropped on upgrade. - Added X-Robots-Tag header to all public API endpoint responses.
- Improved package editor layout by adding title hints and showing two links beneath the slug editor.
- Improved download stat detection to categorize requests by User-Agent (Composer, web browser, CLI, update check, API).
- Improved the Setup tab's mobile layout by replacing inaccessible CSS-generated content labels with real DOM elements.
- Changed checksum storage to a multi-algorithm JSON field, adding sha1 alongside sha256. Existing hashes are migrated on upgrade. Reprocess your ZIPs to register sha1.
- Changed the tags endpoint: replaced
checksum,checksum_version, andchecksum_originfields with a singlechecksumsobject. This is a breaking change. - Resolved the plugin info endpoint returning unresolved
testedversions instead of the latest patch release. - Resolved abandoned plugin versions retaining stale active install counts instead of dropping to 0.
- Removed the
networkboolean column fromtroy_package_metas. Existing rows withnetwork = 1are migrated tonetwork_activation = 'require'on upgrade.
Client:
- Added deactivation explanation link to plugin action links when Troy Client is protected from deactivation.
- Fixed
http_headers_useragentcallbacks crashing when third-party plugins apply the filter without the URL parameter.
Client Daemon:
- Added an install lock to prevent concurrent or rapid-fire install attempts when Troy Client installation fails.
- Fixed
http_headers_useragentcallbacks crashing when third-party plugins apply the filter without the URL parameter.
Installer:
- Fixed
http_headers_useragentcallbacks crashing when third-party plugins apply the filter without the URL parameter.
Note: Changes to Installer also affect Troy Server's generated installer packages, so make sure to update your packages to benefit from these changes.
What's Included
Troy Server — Host your own plugin repository with full WordPress admin integration. Manage plugins via the Block Editor, connect GitHub or WordPress.org repos for automatic updates, and generate installer packages for your clients. Includes anonymous usage statistics.
Troy Client — Enable sideloading for plugin updates, translations, and dependencies from any Troy Server. Simply add a Troy: <repo-url> header to your plugin. Optionally hide plugins from WordPress.org's update API entirely.
Troy Client Daemon — A must-use plugin that enforces Troy Client and blocks WordPress.org APIs until Troy Client is active. Drop it in mu-plugins/ — no configuration needed.
Troy Installer — A tiny installer plugin generated by Troy Server to distribute to your clients. Installs Troy Client and your selected plugins in one click.
Snippets — Helper snippets for hiding Troy Client from the admin, enabling beta channels, and embedding Troy Client in your plugins.
Requirements
| Component | PHP | WordPress | MySQL |
|---|---|---|---|
| Troy Server | 8.4+ | 6.8+ | 8.0.19+ |
| Troy Client | 7.4+ | 6.7+ | 8.0.0+ |
License
MIT — use it freely.
Made with love. By Sybre Waaijer, for the community.
Full Changelog: v1.6.1184...v1.7.1184