> ## Documentation Index
> Fetch the complete documentation index at: https://docs.jaasskills.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Publishing walkthrough

> Publishing the Personal Notes skill through the web UI, screenshots included

Every screenshot on this page is from an actual local run of the stack (`jaas-ui` + `jaas-skills` + `jaas-guardrails`, 2026-09-08) publishing the [Personal Notes skill](/guide/writing-a-skill) end to end — nothing staged or mocked, including the one step that didn't go as planned.

## 1. Sign in

`/login` offers Google sign-in, or the local dev-login path (email + password, gated entirely behind `JAAS_DEV_LOGIN_PASSWORD` — see [Authentication](/getting-started/authentication)).

<Frame>
  <img src="https://mintcdn.com/jaasyoga/03R4WNI2y-WZ4gmJ/images/publishing-walkthrough/01-login.png?fit=max&auto=format&n=03R4WNI2y-WZ4gmJ&q=85&s=7df413f90a330b4d92838b40e6136f77" alt="JaaS Skills sign-in page with Google and dev-login email/password fields" width="1440" height="900" data-path="images/publishing-walkthrough/01-login.png" />
</Frame>

## 2. Drafts

The **Drafts** tab lists in-progress, unpublished skill packages. **Create Skill** starts a new one.

<Frame>
  <img src="https://mintcdn.com/jaasyoga/03R4WNI2y-WZ4gmJ/images/publishing-walkthrough/02-drafts-list.png?fit=max&auto=format&n=03R4WNI2y-WZ4gmJ&q=85&s=ef5501d5f3f11ac07229a1d53168ebbd" alt="Drafts list page with a Create Skill button" width="1440" height="900" data-path="images/publishing-walkthrough/02-drafts-list.png" />
</Frame>

Choosing **Local only** (work in the browser editor, publish when ready) over **GitHub repo** (commit to a connected repo branch — see [Git-native release](/publishing/git-release)) opens an editor seeded with a `manifest.yaml` scaffold and nothing else yet.

<Frame>
  <img src="https://mintcdn.com/jaasyoga/03R4WNI2y-WZ4gmJ/images/publishing-walkthrough/03-new-draft.png?fit=max&auto=format&n=03R4WNI2y-WZ4gmJ&q=85&s=1f872518f533ac65ab9906e7a26380ee" alt="Empty new draft with only manifest.yaml in the file list" width="1440" height="900" data-path="images/publishing-walkthrough/03-new-draft.png" />
</Frame>

## 3. Fill in the files

Editing `manifest.yaml` to the real content from [Writing a skill](/guide/writing-a-skill):

<Frame>
  <img src="https://mintcdn.com/jaasyoga/03R4WNI2y-WZ4gmJ/images/publishing-walkthrough/04-manifest-edited.png?fit=max&auto=format&n=03R4WNI2y-WZ4gmJ&q=85&s=8ed862329b566eeaa3ed4337f4d9eadd" alt="Monaco editor showing the completed personal-notes manifest.yaml" width="1440" height="900" data-path="images/publishing-walkthrough/04-manifest-edited.png" />
</Frame>

Adding `SKILL.md` as a second file via the file panel's add-file control:

<Frame>
  <img src="https://mintcdn.com/jaasyoga/03R4WNI2y-WZ4gmJ/images/publishing-walkthrough/05-skillmd-added.png?fit=max&auto=format&n=03R4WNI2y-WZ4gmJ&q=85&s=f139407082f18bd4ce95463fe8e2676f" alt="SKILL.md added as a second file, with the front-matter and instructions" width="1440" height="900" data-path="images/publishing-walkthrough/05-skillmd-added.png" />
</Frame>

`schema.json` goes in the same way (a third file, same add-file control) — not shown separately here since it's the identical JSON from the previous page.

## 4. Validate

**Validate** runs structural validation plus a live guardrails scan, with no publish yet.

<Frame>
  <img src="https://mintcdn.com/jaasyoga/03R4WNI2y-WZ4gmJ/images/publishing-walkthrough/06-validate-result.png?fit=max&auto=format&n=03R4WNI2y-WZ4gmJ&q=85&s=4e5adb7dee2bb7447d16243dbb198fac" alt="Validate result: Valid — ready to publish, projected certification Level 2 — Standard" width="1440" height="900" data-path="images/publishing-walkthrough/06-validate-result.png" />
</Frame>

Result: **Valid — ready to publish**, with a **projected certification of Level 2 — Standard** shown before anything is committed — exactly the "certification this draft would receive right now" projection described in [the guardrails level model](/guardrails/levels).

## 5. Publish — the corner case, live

Clicking **Publish Skill** the first time hit this, unedited:

<Frame>
  <img src="https://mintcdn.com/jaasyoga/03R4WNI2y-WZ4gmJ/images/publishing-walkthrough/07-publish-duplicate-conflict.png?fit=max&auto=format&n=03R4WNI2y-WZ4gmJ&q=85&s=41c80b8c6f26fa3415be8928096c842d" alt="Publish dialog showing an error: manifest.json has already been published" width="1440" height="900" data-path="images/publishing-walkthrough/07-publish-duplicate-conflict.png" />
</Frame>

This is [the documented duplicate-publish corner case](/reference/corner-cases) firing for real — `jaas.demo.personal-notes:1.0.0` had already been published to this local registry from an earlier run, and the registry correctly refused to overwrite it. The fix is exactly what the docs say: bump the version and re-publish. Retrying at `1.0.1` succeeded:

<Frame>
  <img src="https://mintcdn.com/jaasyoga/03R4WNI2y-WZ4gmJ/images/publishing-walkthrough/08-publish-result.png?fit=max&auto=format&n=03R4WNI2y-WZ4gmJ&q=85&s=a0dfe4ee3e20324a7524e3e7f5fa230d" alt="Published skill detail page for Personal Notes v1.0.1, private, Level 2 guardrail certification, auto-defaulted files listed" width="1440" height="900" data-path="images/publishing-walkthrough/08-publish-result.png" />
</Frame>

A few things worth noticing on this page, all documented behavior confirmed live:

* **"This version is published and immutable — it can never be edited or deleted."** Changing it means **New Version**, which forks it into a new editable draft.
* **Files: `SKILL.md`, `dependencies.yaml`, `manifest.yaml`, `permissions.yaml`, `schema.json`.** Only `manifest.yaml` and `SKILL.md` were ever written by hand — `dependencies.yaml` and `permissions.yaml` were auto-defaulted to empty, exactly as [Package layout](/packages/layout) describes.
* **Guardrail Certification: Level 2 — Standard, with L1 Baseline and L2 Standard both shown Certified.**

## 6. Find it in search

<Frame>
  <img src="https://mintcdn.com/jaasyoga/03R4WNI2y-WZ4gmJ/images/publishing-walkthrough/09-search-results.png?fit=max&auto=format&n=03R4WNI2y-WZ4gmJ&q=85&s=e22567fc9d4b3800f5961f6e8448f8c5" alt="Search results showing Personal Notes, private, productivity, version 1.0.1" width="1440" height="900" data-path="images/publishing-walkthrough/09-search-results.png" />
</Frame>

One thing that isn't a bug, but is worth knowing: search matches indexed tokens (id segments, name words, tags, category, description words — see [the ranking model](/reference/api)), not arbitrary substrings. Searching the hyphenated `personal-notes` (the id's own suffix) returned nothing; searching `notes` (an actual tag) found it immediately. If a search comes up empty, try a real word from the name/tags/category rather than an id fragment.
