Publishing
Publishing sends a skill folder or plugin package to ClawHub under the owner you choose. ClawHub checks that your token can publish for that owner, validates the metadata, name, version, files, and source information, then stores the release and starts automated security checks. If validation fails, nothing is published. New releases may also stay out of normal install and download surfaces until review finishes.Skills
The simplest publishing path is the CLI. Sign in, then publish a local skill folder:--owner <handle> when publishing to an org owner. Omit it to publish as
the authenticated user. Publishing skips unchanged content. A new skill starts
at 1.0.0, and later changes automatically publish the next patch version. Pass
--version only when you need an explicit version.
Skill catalog metadata
Categories place a skill in the category filters on the ClawHub skills browse page. Topics become the filter chips offered inside a selected category. Set both when you publish:Development is rejected. Topics are free-form labels;
ClawHub stores what you pass and displays the normalized form, so Git Worktree
appears as #git-worktree.
Rules ClawHub applies to both fields:
- A skill can carry at most 3 categories and at most 5 topics.
- An unknown category slug fails the publish.
--dry-rundoes not check slugs; the registry validates them when the publish runs. otheris dropped when it is passed alongside a specific category. The 3-category limit is applied after that, soother,development,operationsstores two categories rather than failing.- Repeats are dropped rather than rejected, and they are matched after
normalization, so
git,Gitis one topic. Both limits count what is left after that, not what you passed. - Each topic is at most 48 characters, and topics cannot contain invisible formatting characters.
- These topic names are reserved by ClawHub and are rejected:
approved,audited,certified,clawhub,community,curated,endorsed,featured,official,officials,openclaw,recommended,staff-pick,trusted,trusted-publisher,verified. The check runs on the normalized form, soOfficialandstaff pickare rejected too. - A skill first published without
--categoriesis stored asother, so it only appears under the Other category. - On a later publish, omitting
--categoriesor--topicskeeps the values already stored. Pass the flag again to change them. Passing an empty value clears the field:--categories ""returns the skill toother, and--topics ""removes its topics. - Passing either flag publishes even when the files have not changed, so fixing metadata this way creates a new patch version.
other.
Publishing from a catalog repo
For catalog repos, use ClawHub’s reusableskill-publish.yml workflow.
It calls skill publish for each immediate skill folder under root (default:
skills), or only the folder supplied as skill_path.
dry_run: true to preview new and changed skills without publishing.
The workflow forwards optional changelog, categories, and topics inputs to
skill publish, plus clear_categories and clear_topics for removing metadata
a skill already carries. A skill first published without categories is stored
as other, the same as clawhub sync; you can also set catalog
metadata later from the skill’s settings page.
Like tags, categories and topics apply to every skill the run
publishes, and supplying them suspends the unchanged-skill skip — the run
releases a new patch version of each selected skill, including skills whose files
did not change. Pass skill_path to bound that to one skill. See the
workflow notes for the full behavior.
Plugins
Plugins use npm-style package names. Scoped package names include the owner in the first part of the name:@openclaw/dronzer, it can only be published as @openclaw. If you publish as
@vintageayu, rename the package to @vintageayu/dronzer.
This prevents a package from claiming an org namespace that the publisher does
not control.
If you are the rightful owner of an org, brand, package scope, owner handle, or
namespace that is already claimed or reserved on ClawHub, open an
Org / Namespace Claim issue
with public, non-sensitive proof. See
Org and Namespace Claims for what to include and what
to keep out of public issues.
Before Publishing a Plugin
- Pick an owner that matches the package scope.
- Include
openclaw.plugin.json. Code plugins also needpackage.jsonwithopenclaw.compat.pluginApiandopenclaw.build.openclawVersion. - To show a custom plugin catalog icon on the homepage and plugin list pages,
add
icontoopenclaw.plugin.jsonwith any HTTPS image URL. - Include source repository and exact commit metadata, or use the CLI from a GitHub-backed checkout so it can detect them.
- Run
clawhub package validate <source>before publishing. For package, manifest, SDK import, or artifact findings, see Plugin validation fixes. - Run
clawhub package publish <source> --dry-runbefore creating a release. - Expect new releases to stay out of public install surfaces until automated security checks and verification finish.
Trusted Publishing for Packages
Package trusted publishing is a two-step setup:- Publish the package once through normal manual or token-authenticated
clawhub package publish. This creates the package row and establishes the package managers who can change its trusted publisher config. - A package manager sets the GitHub Actions trusted publisher config:
--environment <name>, the GitHub
Actions environment claim must match that name exactly.
ClawHub verifies the configured GitHub repository when trusted publisher config
is set. Public repositories can be verified through public GitHub metadata.
Private repositories require ClawHub to have GitHub access to that repository,
for example through a future ClawHub GitHub App installation or another
authorized GitHub integration.
The current reusable package publish workflow supports secretless trusted
publishing for workflow_dispatch publishes when id-token: write is
available. Tag-push real publishes still need clawhub_token, so keep
CLAWHUB_TOKEN available for tag releases, first publishes, untrusted packages,
or break-glass publishes.
Real publishes through the reusable workflow wait for the staged attempt to
become public by default. The workflow fails when security checks block or fail
the attempt, the attempt expires, or the 30-minute publication deadline is
reached. Callers can adjust the deadline with publication_timeout_minutes.
The maximum is 40 minutes, leaving 35 minutes of reusable job time for setup,
upload, and output capture.
Set wait_for_publication: false only for an intentional asynchronous publish.
Inspect or remove the config with:
FAQ
Package scope must match selected owner
If the package scope and selected owner do not match, ClawHub rejects the publish:@openclaw/dronzer claims the
@openclaw namespace, so only publishers with access to the @openclaw owner
can publish it.