Publish channels
Three ways to distribute: the Steam Workshop (Steam client), the web Plugin Hub (self-published edition), and the local extensions directory (manual distribution / beta testing).
1. Steam Workshop
| Item | Value |
|---|---|
| Retail AppID | 5521270 |
| Playtest AppID | 5227990 |
| Scan source | Follows the injected SteamAppId at startup; without Steam it defaults to retail |
- Upload through the official Steam Workshop flow (the
MOD exportshipped with the client is only a packaging convenience). - The workshops of the two AppIDs do not share anything — Playtest and retail each need their own upload.
- The Steam client does not access the web Plugin Hub domain (channel design + Steam compliance requirements).
2. Web Plugin Hub (self-published edition only)
Entry: Settings → Extension Workshop → Plugin Hub (PluginHubWindow) → the "Publish" page. The website also has an author center with the same features.
Flow
- Pick a folder or a plugin package to upload → the server parses and validates
mod.json - Fill in the display information + the version number: it defaults to
mod.jsoninside the package, and you can edit it to a higher version to submit a new version (after success it is synced back to your localmod.json) - Submit for review (
datatype + trusted authors are published automatically;scripttype is reviewed by a human) - Under "My plugins" you can edit information / unpublish / submit a new version
Constraints
| Item | Limit |
|---|---|
| Sign-in | You must sign in to a self-published edition account (workshop token TBW1.…, issued together with the device-code sign-in) |
| Single package size | 20 MB (see Packaging & size limit) |
| Versions pending review | at most 5 at the same time |
| Daily submissions | capped (over the cap you get "today's submission limit has been reached") |
| Version number | x.y.z and must be higher than the highest online version |
| Adaptation generation | mod.json must declare "target_app_version": "0.2"; a package without it is refused by the client (see Compatibility & version gates) |
| Plugin id | the author segment cannot be a reserved name (transbox/official/builtin/community/example/workshop/steam/system/admin/root/support/web/test/tbmod) |
Common error codes
| Error code | Meaning |
|---|---|
not_logged_in | the sign-in expired, sign in again |
forbidden | the token has no upload permission (workshop:publish), sign in once more |
id_taken / item_exists | the id is taken / the id already exists online — submit a new version with a new version number |
id_mismatch | the id in the package does not match the online item id |
bad_package | package validation failed (check mod.json and the directory layout) |
reserved_id | a reserved id segment was used |
too_large | over 20 MB |
quota_pending / quota_daily | too many versions pending review / today's submission cap reached |
Official plugins do not go through the Plugin Hub
Official built-in plugins (community_* / workshop.*) are distributed with the client version and are not published to the web Plugin Hub.
3. Local extensions directory (manual distribution)
Users unpack the plugin folder into %APPDATA%/transbox/extensions/ and then refresh in the Extension Workshop. Suited to beta tests, private plugins, and plugins you do not want to make public.
Plugins placed here are marked with the source local, and win when names clash (local > steam > web).
⚠️ The local directory is subject to the same
target_app_versiongate: a 0.1.x-era plugin dropped here will not show up in the list, and the log says[registry] 拒绝识别外部插件 <id>: 缺少 target_app_version 字段. Add"target_app_version": "0.2"first, then refresh.
Channel comparison
| Steam Workshop | Web Plugin Hub | Local directory | |
|---|---|---|---|
| Who can use it | Steam-channel client | Self-published edition client | Everyone |
| Upload method | Official Steam flow | Client publish page / web author center | Manual copy |
| Review | Steam | Platform review (data type can be automatic) | None |
| Size limit | Steam's limits | 20 MB | None |
| Auto-update | Steam client sync | 10 s after client startup + a sync every 24 h | Manual |
Related
- Packaging & size limit
- Hot debugging
- Runtime architecture & lifecycle — scan roots and source priority
- Prerequisite plugins / Host runtimes
