Configuration
The real configuration surface — the config directory, the environment-variable prefix, the registry-URL override, and the auth and storage modes.
There are two configuration surfaces. The CLI reads a small config directory on each machine. A self-hosted registry is configured entirely through environment variables. This page covers both, grounded in the example environment file the repository ships.
The CLI config directory
The CLI keeps its settings in a config directory — the .skillhub folder,
present in two scopes: a project-scoped copy at the repository root and a
machine-global copy under your home directory. Settings resolve project-first,
then global, then built-in defaults.
The settable keys — including registryUrl, the self-host seam — are documented
on the config page. Credentials are stored separately from
config: the CLI prefers your OS keychain and falls back to a private-mode file.
See API tokens for how credentials are issued and used.
The environment-variable prefix
Every registry environment variable shares one product prefix: SKILLHUB_.
Runtime code never hardcodes it — the prefix is owned by the branding seam and
every variable name is built from a single helper, so a product rename changes
the prefix in one place. That's why the variables on this page are written
SKILLHUB_-prefixed. The example environment file in the repository lists
every variable by its full literal name with a working local default; copying it
to your own .env is the intended starting point.
The registry-URL override
The single most important setting for pointing the CLI at a registry you run is the registry-URL override. It resolves in order of precedence:
- The
--registry-urlcommand-line flag. - The registry-URL environment variable (
SKILLHUB_REGISTRY_URL). - The
registryUrlproject config key. - The
registryUrlglobal config key. - The built-in default.
Setting the environment variable lets a whole shell or CI job target your
registry with no stored config. The config-key routes are described on the
config page.
Database
The registry reads its Postgres connection from a single DSN:
SKILLHUB_DATABASE_URL— the full Postgres connection string. Override it to point at a remote database without touching anything else.
The example environment file also breaks the connection into individual parts (user, password, database name, port) that the local Compose stack reads to bring up its own Postgres.
Storage
Skill archives live in an S3-compatible bucket. Storage runs in one of two modes,
selected by the SKILLHUB_STORAGE variable:
SKILLHUB_STORAGE=s3 is the default. The S3 adapter is configured from the
storage variables:
SKILLHUB_S3_ENDPOINT— the S3 API endpoint (the local MinIO endpoint by default).SKILLHUB_S3_BUCKET— the bucket that holds skill archives.SKILLHUB_S3_ACCESS_KEY_IDandSKILLHUB_S3_SECRET_ACCESS_KEY— the credentials the adapter reads.SKILLHUB_S3_REGION— the region string.
SKILLHUB_STORAGE=local is a Docker-free store whose presigned URLs are
served by the server's own origin. It needs none of the S3 variables and exists
so a plain-fetch client can drive the byte-identical upload and download flows
with no external storage service running.
Auth mode
Authentication runs behind an adapter selected at boot:
SKILLHUB_AUTH=stub— the default developer mode. It uses deterministic seeded identities and a local sign-in page, so no external auth project is required.SKILLHUB_AUTH=supabase— the hosted auth adapter, which requires its own URL and key variables to be set.
The Supabase URL and key variables are only required when
SKILLHUB_AUTH=supabase. Left at the default stub mode, a fresh registry
signs in with seeded identities and needs no external auth project — so you can
stand one up before wiring up hosted auth.
Other server variables
SKILLHUB_PORT— the HTTP port the reference server listens on.SKILLHUB_SCANNER—rules(the default — the shared rule-pack scanner, so a local publish is scanned exactly as a production one is) orpermissive(an always-pass engine for local publish loops).SKILLHUB_BILLING—offfor a self-hosted registry; the hosted billing provider is not part of a self-host build.
For a self-hosted registry, billing runs off and entitlements are intended to
come from a signed license file rather than a hosted subscription. See
Open core for what a hosted offering adds on top
of the core.