Getting started
Run a kvellman origin and get a Windows client installing from it in about ten minutes.
What is kvellman?
kvellman is a self-hosted, winget-compatible package repository. You register it as an
additional winget source — the winget CLI queries it exactly like the official Microsoft source.
The origin is the server you run: the admin UI, the winget Source API, and installer delivery.
Clients are unmodified winget installations — nothing installs on the Windows side beyond a
source registration.
What you need
A host that can run a container, a DNS name pointing at it, and trusted HTTPS. winget refuses REST
sources that aren't served over HTTPS with a certificate the client trusts — including localhost
on recent winget versions.
1. Run the origin (Docker)
The Community edition runs from a single docker compose stack (app + PostgreSQL). With a domain
pointing at your host and ports 80/443 open:
git clone <open-core-repo> kvellman && cd kvellman
cp .env.deploy.example .env.deploy # set DOMAIN, NUXT_SESSION_PASSWORD, POSTGRES_PASSWORD
docker compose --env-file .env.deploy up -d
Database migrations run automatically on start. Open https://your-domain — the first visit
creates the admin account.
2. Create a site token
In the web UI: Admin → Site tokens → create one. The token becomes part of the URL clients use to reach this source. See Sites for what a site token actually controls.
3. Add a package
Two ways to get a package into the catalogue:
- Import it from the upstream winget catalogue (Packages → Import), or
- Author it yourself: create the package and upload a manifest.
Either way, a new version isn't visible to clients until it's approved — open the version and
approve it (Packages → your package → the pending version). This is the step people most often
miss: an imported package that shows up in the dashboard but returns nothing from winget search
almost always just needs approval.
4. Add the source on a client
winget requires HTTPS for a REST source. On a Windows client (PowerShell):
winget source add --name kvellman --type Microsoft.Rest --arg "https://your-domain/api/<site-token>"
winget search --source kvellman <term>
winget install --source kvellman <Package.Identifier>
That's it — clients now install internal software through your own winget source.
Next steps
- Concepts — the vocabulary the rest of the docs use.
- Packages & manifests — importing, overlays, approval, installer storage.
- Sites — site tokens, URL placeholders, onboarding more clients.
- Users & roles — accounts, the audit log, SSO/MFA.
- Edge nodes — serving remote locations from a local cache.
- Deployment — the reverse-proxy requirement, configuration, operations.