Conor BronsdonandClaude Fable 5 fd3bef4ae7 docs: document skill categories and topics (#3380)
* docs: document skill categories and topics

Add a Catalog metadata section to docs/publishing.md covering --categories
and --topics, the 14 valid category slugs, the limits ClawHub enforces, the
reserved topic names, the `other` default, and how stored values change on a
later publish. Cross-reference it from the skill publish and sync entries in
docs/cli.md.

Values read from packages/schema/src/catalogMetadata.ts,
convex/lib/skillPublish.ts, and packages/clawhub/src/cli.ts.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs: cover the CI and plugin paths for catalog metadata

Three gaps in the first pass, all the same shape as the one this PR set
out to fix -- a way to publish with no way to set catalog metadata:

The reusable skill-publish.yml workflow has no categories or topics
input. It builds the command with --owner and --tags only, so a catalog
repo publishing through CI lands every skill in `other`, exactly like
sync. The new section sat directly under the workflow snippet and said
"set both when you publish," which read as though the block above it
could. Documented in both files.

`package publish` takes the same two flag names against
PLUGIN_CATEGORY_DEFINITIONS -- a different 12-slug list documented
nowhere -- so a reader who followed the new link would try
`development` and have the publish rejected. The cli.md entry now names
the plugin slugs and says the topic rules are shared, which they are:
convex/packages.ts:8585 resolves through resolvePluginCategories but
reuses normalizeCatalogTopics.

Moved the metadata section above the catalog-repo prose so the flags sit
with the command they belong to, and gave the CI content its own
heading rather than leaving it to trail the section. No wording in the
moved block changed.

Also two enforced rules the first pass omitted: repeats are dropped
rather than rejected and are matched after normalization (so `git,Git`
is one topic, and both limits count what survives), and topics cannot
contain invisible formatting characters. Qualified the 3-category limit,
which is applied after `other` is dropped, so `other,development,
operations` stores two rather than failing.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs: scope plugin-category validation to code and bundle plugins

Review caught that the package-publish bullet claimed every publish
validates --categories against the 12 plugin slugs. The claw family
does not: convex/packages.ts branches on family === "claw" and stores
the declared slugs without resolvePluginCategories, while
normalizeCatalogTopics still runs for every family. The bullet now
limits the slug check to code and bundle plugins, links docs/claws.md
for the exception, and keeps the shared-topic-rules claim, which held.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-05 15:51:27 -07:00
2026-01-07 18:28:51 +01:00
2026-04-30 23:39:28 -07:00
2026-01-03 14:49:41 +01:00

ClawHub

ClawHub banner

ClawHub

CI status Discord MIT License

ClawHub is the public skill registry for OpenClaw: publish, version, and search text-based agent skills (a SKILL.md plus supporting files). It's designed for fast browsing + a CLI-friendly API, with moderation hooks and vector search. It also now exposes a native OpenClaw package catalog for code plugins and bundle plugins.

ClawHub · Vision · Docs · Contributing · Discord

What you can do with it

  • Browse skills + render their SKILL.md.
  • Publish new skill versions with changelogs + tags (including latest).
  • Rename an owned skill without breaking old links or installs.
  • Merge duplicate owned skills into one canonical slug.
  • Search via embeddings (vector index) instead of brittle keywords.
  • Star + comment; admins/mods can curate and approve skills.
  • Pin local skill installs so updates and force reinstalls cannot overwrite frozen copies.
  • Browse OpenClaw packages with family/trust/capability metadata.
  • Publish native code plugins and bundle plugins through /packages APIs and CLI flows.

How it works (high level)

  • Web app: TanStack Start (React, Vite/Nitro).
  • Backend: Convex (DB + file storage + HTTP actions) + Convex Auth (GitHub OAuth).
  • Search: OpenAI embeddings (text-embedding-3-small) + Convex vector search.
  • API schema + routes: packages/schema (clawhub-schema).

CLI

Common CLI flows:

  • Auth: clawhub login, clawhub whoami
  • Remote/headless auth: clawhub login --device
  • Discover: clawhub search ..., clawhub explore
  • Browse unified catalog (skills + plugins): clawhub package explore, clawhub package inspect <name>
  • Manage local installs: clawhub install @openclaw/demo, clawhub pin <skill>, clawhub unpin <skill>, clawhub uninstall <skill>, clawhub list, clawhub update --all
  • Inspect without installing: clawhub inspect @openclaw/demo
  • Publish skills: clawhub skill publish <path>
  • Publish plugins: clawhub package publish <source>
  • Code-plugin manifests must include openclaw.compat.pluginApi and openclaw.build.openclawVersion; see docs/cli.md for a minimal example.
  • Canonicalize owned skills: clawhub skill rename <skill> <new-name>, clawhub skill merge <source> <target>

Docs: docs/quickstart.md, docs/cli.md.

Removal permissions

  • clawhub uninstall <skill> only removes a local install on your machine.
  • Uploaded registry skills use soft-delete/restore (clawhub delete <skill> / clawhub undelete <skill> or API equivalents).
  • Soft-delete/restore is allowed for the skill or package owner, publisher owner/admin, moderators, and admins.
  • Packages use clawhub package delete <name> / clawhub package undelete <name>.
  • Hard delete is admin-only (management tools / ban flows).
  • Owner rename keeps the old slug as a redirect alias.
  • Owner merge hides the source listing and redirects the old slug to the canonical target.

Telemetry

ClawHub tracks minimal install telemetry (to compute install counts) when you run clawhub install while logged in. Disable via:

export CLAWHUB_DISABLE_TELEMETRY=1

Details: docs/telemetry.md.

Repo layout

  • src/ — TanStack Start app (routes, components, styles).
  • convex/ — schema + queries/mutations/actions + HTTP API routes.
  • packages/schema/ — shared API types/routes for the CLI and app.
  • docs/ — publishable ClawHub public/operator docs for users, publishers, API clients, and deploy operators.
  • specs/ — product specs, plans, regression notes, and design history.
  • specs/spec.md — product + implementation spec (good first read for maintainers).

Local dev

Prereqs: Bun (Convex runs via bunx, no global install needed). The detached worktree path also requires Worktrunk (wt).

bun install
cp .env.local.example .env.local
# edit .env.local — see CONTRIBUTING.md for local Convex values

# terminal A: local Convex backend
bunx convex dev

# terminal B: web app (port 3000)
bun run dev

# detached/Codex worktree preview
bun run setup:worktree
bun run dev:worktree
wt --yes url

# seed local QA fixtures and the public corpus
bun run seed:dev

bun run seed:dev waits for the local Convex deployment, runs the dev fixture seed, and refreshes global stats. The fixtures are owned by @local and are safe to rerun after fixture or schema changes. For reset/manual commands and full setup instructions (env vars, GitHub OAuth, JWT keys, database seeding), see CONTRIBUTING.md.

Environment

  • VITE_CONVEX_URL: Convex deployment URL (https://<deployment>.convex.cloud).
  • VITE_CONVEX_SITE_URL: Convex site URL (https://<deployment>.convex.site).
  • CONVEX_SITE_URL: same as VITE_CONVEX_SITE_URL (auth + cookies).
  • SITE_URL: App URL (local: http://localhost:3000).
  • AUTH_GITHUB_ID / AUTH_GITHUB_SECRET: GitHub OAuth App.
  • JWT_PRIVATE_KEY / JWKS: Convex Auth keys.
  • OPENAI_API_KEY: embeddings for search + indexing.

Nix plugins (nixmode skills)

ClawHub can store a nix-clawdbot plugin pointer in SKILL frontmatter so the registry knows which Nix package bundle to install. A nix plugin is different from a regular skill pack: it bundles the skill pack, the CLI binary, and its config flags/requirements together.

Add this to SKILL.md:

---
name: peekaboo
description: Capture and automate macOS UI with the Peekaboo CLI.
metadata:
  {
    "clawdbot":
      {
        "nix":
          {
            "plugin": "github:clawdbot/nix-steipete-tools?dir=tools/peekaboo",
            "systems": ["aarch64-darwin"],
          },
      },
  }
---

Install via nix-clawdbot:

programs.clawdbot.plugins = [
  { source = "github:clawdbot/nix-steipete-tools?dir=tools/peekaboo"; }
];

You can also declare config requirements + an example snippet:

---
name: padel
description: Check padel court availability and manage bookings via Playtomic.
metadata:
  {
    "clawdbot":
      {
        "config":
          {
            "requiredEnv": ["PADEL_AUTH_FILE"],
            "stateDirs": [".config/padel"],
            "example": "config = { env = { PADEL_AUTH_FILE = \\\"/run/agenix/padel-auth\\\"; }; };",
          },
      },
  }
---

To show CLI help (recommended for nix plugins), include the cli --help output:

---
name: padel
description: Check padel court availability and manage bookings via Playtomic.
metadata: { "clawdbot": { "cliHelp": "padel --help\\nUsage: padel [command]\\n" } }
---

metadata.clawdbot is preferred, but metadata.clawdis and metadata.openclaw are accepted as aliases.

Skill metadata

Skills declare their runtime requirements (env vars, binaries, install specs) in the SKILL.md frontmatter. ClawHub's security analysis checks these declarations against actual skill behavior; medium review findings stay visible, and the suspicious filter is reserved for high-impact or malicious concerns.

Full reference: docs/skill-format.md

Quick example:

---
name: my-skill
description: Does a thing with an API.
metadata:
  openclaw:
    requires:
      env:
        - MY_API_KEY
      bins:
        - curl
    primaryEnv: MY_API_KEY
---

Scripts

bun run dev
bun run build
bun run test
bun run coverage
bun run lint
S
Description
No description provided
Readme MIT
221 MiB
Languages
TypeScript 87.8%
Python 4%
CSS 3.9%
Shell 2.4%
JavaScript 1.8%