Self-hosted agent skill registry. Publish, version, and distribute agent skills across your organization — with a Web UI, REST API, and CLI client built on the ClawHub protocol. Ideal for enterprises building their own internal agent skill registry.
- Own your data — Run on your infrastructure. No vendor lock-in, no external dependencies.
- Single binary — One Go binary serves the registry, Web UI, and CLI. Deploy anywhere.
- Zero-dependency mode — SQLite by default, no external services needed. PostgreSQL supported for production.
- Git-native versioning — Every skill version is a Git commit in a bare repository. Full history, diffs, and rollbacks built in.
- Instant search — Embedded Bleve full-text search across skill names, summaries, and tags.
- ClawHub compatible — Implements the ClawHub registry protocol. Skills published to SkillHub work with any ClawHub-compatible client.
- Webhook import — Push to GitHub/GitLab/Gitea and skills are auto-imported and published.
- Auth & RBAC — bcrypt password authentication, scoped API tokens, role-based access control (admin / moderator / user).
Prerequisites: Go 1.25+, Node.js 22+
git clone https://github.com/cinience/skillhub.git
cd skillhub
make quickstart ADMIN_USER=admin ADMIN_PASSWORD=admin123This builds the binary (frontend + backend), creates an admin user, and starts the server using SQLite — no Docker or external databases needed.
Open http://localhost:10070.
git clone https://github.com/cinience/skillhub.git
cd skillhub
SKILLHUB_ADMIN_PASSWORD=secret make docker-upThis starts PostgreSQL and SkillHub in one command. An admin user is created automatically on first boot.
Open http://localhost:10070.
make setup ADMIN_USER=admin ADMIN_PASSWORD=admin123 # Build + create admin
make dev # Start server on :10070By default SkillHub uses SQLite. To use PostgreSQL instead:
make pg-up # Start PostgreSQL via Docker
SKILLHUB_DB_DRIVER=postgres \
SKILLHUB_DATABASE_URL='postgres://skillhub:skillhub@localhost:5432/skillhub?sslmode=disable' \
make devThe server auto-runs migrations and creates the admin user on first startup. Subsequent restarts are idempotent.
The skillhub binary is both the server and the client.
# Auth
skillhub login # Interactive login (registry URL + API token)
skillhub whoami # Show current user
# Discover
skillhub search "browser automation" # Full-text search
skillhub list --sort downloads # Browse registry
skillhub inspect agent-browser # Skill details + version history
# Install & manage
skillhub install agent-browser # Install latest version
skillhub install agent-browser --version 2.0.0
skillhub installed # List local skills
skillhub update --all # Update all installed skills
skillhub uninstall agent-browser # Remove
# Publish
skillhub publish ./my-skill \
--slug my-skill --version 1.0.0 \
--tags "coding,automation" \
--summary "A useful coding skill"
# Admin
skillhub admin create-user --handle alice --role admin --password secret
skillhub admin create-token --user alice --label "CI"
skillhub admin set-password --user alice --password newpassSkills are installed to ~/.skillhub/skills/ by default. Customize via skills_dir in ~/.skillhub/config.yaml.
graph LR
subgraph Clients
W["Web UI"]
C["CLI"]
A["AI Agents"]
end
subgraph SkillHub["SkillHub Server"]
direction TB
R["Router & Middleware<br/>Auth · Rate Limit · Logging"]
S["Service Layer<br/>Skill · Auth · Import"]
R --> S
end
subgraph Storage
G[("Git<br/>Repos")]
B[("Bleve<br/>Search")]
D[("SQLite /<br/>Postgres")]
end
W & C & A --> R
S --> G & B & D
skillhub/
├── cmd/skillhub/ # Entry point — server + CLI routing
│ └── main.go
├── pkg/
│ ├── auth/ # bcrypt passwords, HMAC API tokens, sessions
│ ├── cli/ # CLI client (config, HTTP client, commands, output)
│ ├── config/ # YAML config + environment variable overrides
│ ├── gitstore/ # Bare Git repo storage, mirror push, webhook import
│ ├── handler/ # HTTP handlers (skill, auth, search, admin, web UI)
│ ├── middleware/ # Auth, rate limiting, request ID, logging
│ ├── model/ # Domain models (User, Skill, Version, Token, Star)
│ ├── repository/ # Database repositories (GORM)
│ ├── search/ # Bleve full-text search integration
│ ├── server/ # Server bootstrap, routing, auto-setup
│ └── service/ # Business logic (publish, download, versioning)
├── configs/ # Default config (skillhub.yaml)
├── web/ # React frontend (Vite + TypeScript + i18n)
├── web/templates/ # Server-rendered HTML fallback (Go templates)
├── deployments/docker/ # Dockerfile + docker-compose.yml
├── Makefile
└── go.mod
Configuration is loaded from configs/skillhub.yaml with environment variable overrides:
| Variable | Description | Default |
|---|---|---|
SKILLHUB_PORT |
Server port | 10070 |
SKILLHUB_HOST |
Bind address | 0.0.0.0 |
SKILLHUB_BASE_URL |
Public URL | http://localhost:10070 |
SKILLHUB_DB_DRIVER |
Database driver | sqlite |
SKILLHUB_DATABASE_URL |
Database connection string | ./data/skillhub.db |
SKILLHUB_GIT_PATH |
Git storage path | ./data/repos |
SKILLHUB_ADMIN_USER |
Auto-create admin on startup | (empty) |
SKILLHUB_ADMIN_PASSWORD |
Admin password | (empty) |
SKILLHUB_CONFIG |
Config file path | configs/skillhub.yaml |
The CLI client stores its config in ~/.skillhub/config.yaml:
registry: http://localhost:10070 # Registry server URL
token: clh_xxxxxxxxxxxx # API token (set via `skillhub login`)
skills_dir: ~/.skillhub/skills # Skill install directory (optional)| Field | Description | Default |
|---|---|---|
registry |
Registry server URL | http://localhost:10070 |
token |
API token for authentication | (set via skillhub login) |
skills_dir |
Local skill install directory | ~/.skillhub/skills |
| Method | Path | Description |
|---|---|---|
GET |
/api/v1/skills |
List skills |
GET |
/api/v1/skills/:slug |
Get skill details |
GET |
/api/v1/skills/:slug/versions |
List versions |
GET |
/api/v1/skills/:slug/versions/:version |
Get specific version |
GET |
/api/v1/skills/:slug/file |
Get skill file content |
GET |
/api/v1/search?q=... |
Full-text search |
GET |
/api/v1/download?slug=...&version=... |
Download skill ZIP |
GET |
/api/v1/resolve |
Resolve skill version |
GET |
/healthz |
Liveness check |
GET |
/readyz |
Readiness check |
GET |
/.well-known/clawhub.json |
ClawHub protocol discovery |
| Method | Path | Description |
|---|---|---|
GET |
/api/v1/whoami |
Current user info |
POST |
/api/v1/skills |
Publish a skill |
DELETE |
/api/v1/skills/:slug |
Soft-delete a skill |
POST |
/api/v1/skills/:slug/undelete |
Restore a deleted skill |
POST |
/api/v1/stars/:slug |
Star a skill |
DELETE |
/api/v1/stars/:slug |
Unstar a skill |
| Method | Path | Description |
|---|---|---|
GET |
/api/v1/users |
List users |
POST |
/api/v1/users |
Create user |
POST |
/api/v1/tokens |
Create API token |
POST |
/api/v1/users/ban |
Ban/unban user |
POST |
/api/v1/users/role |
Set user role |
| Method | Path | Description |
|---|---|---|
POST |
/api/v1/webhooks/github |
GitHub push webhook |
POST |
/api/v1/webhooks/gitlab |
GitLab push webhook |
POST |
/api/v1/webhooks/gitea |
Gitea push webhook |
| Component | Technology |
|---|---|
| Language | Go 1.25 |
| Web Framework | Gin |
| Frontend | React 19 + Vite + TypeScript |
| Database | SQLite (default) / PostgreSQL 17 via GORM |
| Search | Bleve (embedded full-text search) |
| Git Storage | go-git |
| Auth | bcrypt + HMAC tokens |
See CONTRIBUTING.md for development setup, coding guidelines, and PR process.
To report a security vulnerability, please see SECURITY.md.