Skip to content

Storage Layout

Every bin (your personal bin and each organization) is backed by a private GitHub directory repo. All writes go through the SkillsBin API as atomic Git commits, so the repo is a complete, human-readable, version-controlled mirror of your items.

Identity model

An item is identified by four coordinates:

(org, project, type, slug)
  • org — which directory repo the item lives in (personal bin or an organization).
  • project — a grouping, usually named after a git repository. Items not assigned to a project live in the inbox (_inbox).
  • type — one of the 13 item types (skill, command, prompt, spec, plugin, agent, statusline, hook, mcp, rule, keybinding, script, secret).
  • slug — the item’s identifier, unique within its (org, project, type) folder.

This full identity is what sb put matches against when deciding between update and create — the same slug in a different project, or with a different type, is a different item. Uniqueness is enforced at create time: a taken slug gets a -2, -3, … suffix. Paths contain no random suffixes.

Path scheme

Each item owns one folder:

{project | _inbox}/{type-plural}/{slug}/

The folder contains:

FilePurpose
Main fileThe item’s content, named by type (see below).
sb.jsonThe manifest — identity, provenance, and timestamps.
Extra filesAny additional files, for multi-file types (skill, plugin). Statusline screenshots (screenshot.png/screenshot.jpg) also live here.

The main file and sb.json are always written in the same commit.

Main filename by type

TypeFolderMain file
skillskills/SKILL.md
commandcommands/<slug>.md
promptprompts/<slug>.md
specspecs/spec.md
pluginplugins/.claude-plugin/plugin.json
agentagents/<slug>.md
statuslinestatuslines/<slug>.sh
hookhooks/<slug>.sh
mcpmcps/<slug>.json
rulerules/CLAUDE.md
keybindingkeybindings/<slug>.json
scriptscripts/<slug> (slug includes the extension)
secretsecrets/secret.enc (encrypted envelope, see Secrets)

Example tree

webapp/ ← project (from the "webapp" git repo)
├── skills/
│ └── deploy-helper/
│ ├── SKILL.md
│ ├── sb.json
│ └── scripts/check.sh ← extra file uploaded with the skill
├── specs/
│ └── ci-plan/
│ ├── spec.md
│ └── sb.json
└── secrets/
└── env/
├── secret.enc ← ciphertext only; GitHub never sees plaintext
└── sb.json
_inbox/ ← items not assigned to any project
└── commands/
└── my-command/
├── my-command.md
└── sb.json

The sb.json manifest

Every item folder carries an sb.json manifest, kept in sync with the item on each write:

{
"manifest_version": 2,
"name": "Deploy Helper",
"slug": "deploy-helper",
"type": "skill",
"project": "webapp",
"description": "A skill that helps with deployments",
"encrypted": false,
"source_filename": "SKILL.md",
"source": {
"repo": "acme/webapp",
"branch": "main",
"path": ".claude/skills/deploy-helper/SKILL.md"
},
"created_at": "2026-07-01T09:30:00+00:00",
"updated_at": "2026-07-20T14:12:00+00:00"
}
FieldDescription
manifest_versionManifest schema version. Currently 2.
nameDisplay name.
slugItem slug (matches the folder name).
typeItem type.
projectProject slug, or null for inbox items.
descriptionItem description, or null.
encryptedtrue for secrets — the main file is a ciphertext envelope.
source_filenameOriginal filename at upload time (used to restore secrets, for example).
sourceProvenance recorded by sb put from inside a git repo: repo (owner/name), branch, and path (repo-relative). null when uploaded outside a repo.
created_at / updated_atISO-8601 timestamps.

Revisions

Each sb put produces one Git commit, and SkillsBin records the commit SHA as a revision of the item. Because the path is stable, an item’s full history is the Git history of its folder.