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.
- Git-native versioning — Every skill version is a Git commit in a bare repository. Full history, diffs, and rollbacks built in.
- Instant search — Meilisearch-powered full-text search with typo tolerance across skill names, summaries, and tags.
- ClawHub compatible — Implements the ClawHub registry protocol. Skills published to SkillBase 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).
git clone https://github.com/oujingzhou/skillbase.git
cd skillbase
make docker-upThis starts PostgreSQL, Meilisearch, and SkillBase in one command. An admin user (admin / admin123) is created automatically on first boot.
Customize admin credentials:
SKILLBASE_ADMIN_USER=myname SKILLBASE_ADMIN_PASSWORD=secret make docker-upOpen http://localhost:8080.
Prerequisites: Go 1.25+, Docker
# One command: start deps + build + create admin + start server
make quickstart ADMIN_USER=admin ADMIN_PASSWORD=admin123Or step by step:
make deps-up # Start PostgreSQL + Meilisearch
make setup ADMIN_USER=admin ADMIN_PASSWORD=admin123 # Build + create admin
make dev # Start server on :8080go build -o skillbase ./cmd/skillbase/
SKILLBASE_ADMIN_USER=admin \
SKILLBASE_ADMIN_PASSWORD=admin123 \
./skillbase serveThe server auto-runs migrations and creates the admin user on first startup. Subsequent restarts are idempotent.
The skillbase binary is both the server and the client.
# Auth
skillbase login # Interactive login (registry URL + API token)
skillbase whoami # Show current user
# Discover
skillbase search "browser automation" # Full-text search
skillbase list --sort downloads # Browse registry
skillbase inspect agent-browser # Skill details + version history
# Install & manage
skillbase install agent-browser # Install latest version
skillbase install agent-browser --version 2.0.0
skillbase installed # List local skills
skillbase update --all # Update all installed skills
skillbase uninstall agent-browser # Remove
# Publish
skillbase publish ./my-skill \
--slug my-skill --version 1.0.0 \
--tags "coding,automation" \
--summary "A useful coding skill"
# Admin
skillbase admin create-user --handle alice --role admin --password secret
skillbase admin create-token --user alice --label "CI"
skillbase admin set-password --user alice --password newpassSkills are installed to ~/.skillbase/skills/ by default. Customize via skills_dir in ~/.skillbase/config.yaml.
graph LR
subgraph Clients
W["🌐 Web UI"]
C["⌨️ CLI"]
A["🤖 AI Agents"]
end
subgraph SkillBase["SkillBase 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")]
M[("Meili<br/>Search")]
P[("Postgres<br/>DB")]
end
W & C & A --> R
S --> G & M & P
skillbase/
├── cmd/skillbase/ # Entry point — server + CLI routing
│ └── main.go
├── internal/
│ ├── 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/ # PostgreSQL repositories (sqlx)
│ ├── search/ # Meilisearch integration
│ ├── server/ # Server bootstrap, routing, auto-setup
│ └── service/ # Business logic (publish, download, versioning)
├── migrations/ # SQL migration files (golang-migrate)
├── configs/ # Default config (skillbase.yaml)
├── web/templates/ # Server-rendered HTML (Go templates)
├── deployments/docker/ # Dockerfile + docker-compose.yml
├── Makefile
└── go.mod
Configuration is loaded from configs/skillbase.yaml with environment variable overrides:
| Variable | Description | Default |
|---|---|---|
SKILLBASE_PORT |
Server port | 8080 |
SKILLBASE_HOST |
Bind address | 0.0.0.0 |
SKILLBASE_BASE_URL |
Public URL | http://localhost:8080 |
SKILLBASE_DATABASE_URL |
PostgreSQL connection string | postgres://skillbase:skillbase@localhost:5432/skillbase?sslmode=disable |
SKILLBASE_MEILI_URL |
Meilisearch URL | http://localhost:7700 |
SKILLBASE_MEILI_KEY |
Meilisearch API key | (empty) |
SKILLBASE_GIT_PATH |
Git storage path | ./data/repos |
SKILLBASE_ADMIN_USER |
Auto-create admin on startup | (empty) |
SKILLBASE_ADMIN_PASSWORD |
Admin password | (empty) |
SKILLBASE_CONFIG |
Config file path | configs/skillbase.yaml |
The CLI client stores its config in ~/.skillbase/config.yaml:
registry: http://localhost:8080 # Registry server URL
token: clh_xxxxxxxxxxxx # API token (set via `skillbase login`)
skills_dir: ~/.skillbase/skills # Skill install directory (optional)| Field | Description | Default |
|---|---|---|
registry |
Registry server URL | http://localhost:8080 |
token |
API token for authentication | (set via skillbase login) |
skills_dir |
Local skill install directory | ~/.skillbase/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 |
| Database | PostgreSQL 17 + sqlx |
| Migrations | golang-migrate |
| Search | Meilisearch |
| Git Storage | go-git |
| Auth | bcrypt + HMAC tokens |
| Versioning | Semantic Versioning via semver |
MIT