
WordPress plugins are distributed via ZIP files. You download one, upload it through the admin dashboard, click activate. Updates land the same way — a banner in the dashboard, one click, done. The entire workflow lives in a browser.
All Aboard the ZIP Ship
Composer runs on a manifest — composer.json — and ships the packages for you. Until now, Troy wasn't on Composer's charts. If you used Bedrock or any Composer-managed WordPress setup, you had to handle Troy-hosted plugins separately — or leave them on the dock.
Troy opens a port today.
What's New
Troy Server now exposes a native Composer 2 repository endpoint. Every plugin and package you publish can ship via composer require. No extra server configuration. No separate build step.
For example, merge these entries into your composer.json to install Troy Server:
{
"repositories": [
{
"type": "composer",
"url": "https://repo.deploytroy.org/composer/get"
}
],
"require": {
"deploytroy-package/troy-server-installer": "*"
}
}
Run composer install and you're done.
Dual-Hosting: One Plugin, Two Channels
Every plugin on your Troy Server is automatically available through both distribution channels:
- WordPress update API — Traditional dashboard-based updates via Troy Client.
- Composer — Direct dependency resolution in any Composer-managed project.
You don't configure this separately. Publish a plugin on Troy Server, and it ships from the same harbor through both channels. A site owner using the WordPress admin gets updates through Troy Client. A developer using Bedrock gets the same plugin through composer update.
A Natural Fit for Bedrock
Bedrock manages WordPress plugins through Composer and WP Packages. If you already have a composer.json, you can add the repositories from a terminal. Here's a working example using my free Pro Mime Types plugin — swap the second repo and package name for your own:
composer config repositories.deploytroy composer https://repo.deploytroy.org/composer/get
composer config repositories.cyberwire composer https://repo.cyberwire.nl/composer/get
Then require the package:
composer require cyberwire-package/pro-mime-types-installer
That's it. WP Packages serves WordPress.org plugins. Troy serves mine. Composer resolves both in the same composer install.
Require the Package, Not the Plugin
When installing a Troy plugin through Composer, use the {vendor}-package prefix. The Package includes Troy Client alongside the plugin.
Even in Composer-managed setups where file updates are disabled, WordPress still phones home to WordPress.org with your full plugin list. Troy Client filters those requests — it removes Troy plugins from the outgoing check so WordPress.org never sees them. It also reports active installations back to your Troy Server, giving you version distribution and locale data without collecting domains or user information.
Read the full details in the Composer documentation.
Under the Hood
Troy Server implements the Composer 2 metadata-url protocol. When Composer encounters your repository, it fetches packages.json — which contains no package data, only a URL template. Composer then requests metadata for each package it needs, not the full catalog.
Even with hundreds of plugins on your server, resolution stays fast.
Get Started
If you're not running Troy Server yet, start with the installation guide. Then read the Composer setup documentation for the full walkthrough: repository configuration, vendor slugs, Bedrock integration, and troubleshooting.
If you're already on Troy Server, update to 1.7.1184. Optionally set your vendor slug in Troy Server → Setup → Composer Settings — the port is now open.
