---
title: Publishing
description: Share skillsets and skills on the public registry or your org's private one.
status: draft
sidebar:
  order: 3
---

```sh
sks upload my-skillset          # whole skillset
sks upload-skill my-skill       # a single skill
```

Versions live in `nori.json` and follow semver. On a name collision the
client byte-compares content and offers: bump the patch version (default),
view a diff, or cancel. Non-interactive uploads must pass `--version`.

## Public vs org registries

- **Public** ([noriskillsets.dev](https://noriskillsets.dev)) — any
  logged-in user can publish; new packages are moderated before they appear
  in search.
- **Org** (`<org>.noriskillsets.dev`) — membership required; reference
  packages as `org/name` or use `--registry`.

## Tokens for CI

API tokens are self-describing — `nori_<org>_<64 hex>` — and scope to one
registry. Set `NORI_API_TOKEN` in CI and every command authenticates with
zero configuration; the registry URL is derived from the token itself.

Long-lived tokens never leave your machine's env; interactive logins use
Firebase tokens cached for ~55 minutes.
