Artifact Repositories
Artifact Repositories collect package and binary artifacts that authors need to build, validate, and run governed data work. Qarion supports private Python package repositories, dbt and SQLMesh package references, model artifacts, and hosted OCI repositories for Docker images, Helm charts, and generic OCI artifacts.
Use this page when you need to decide where an artifact belongs, how repository scope affects access, or what to check when package clients, imports, scans, or downloads do not behave as expected.
Repository Types
The Artifact Repositories screen is organized by artifact family.
| Tab | Use it for | Do not use it for |
|---|---|---|
| Python Packages | Internal wheels, source distributions, CLI packages, SDK builds, and controlled PyPI mirrors used by notebooks, Pipeline Authoring, Transform Models, or CI jobs. | Docker images, Helm charts, or model metadata. |
| dbt / SQLMesh | Cataloging transform package references used by Transform Authoring projects, including private dbt/SQLMesh packages and public dbt package imports. | Python wheels or OCI images. |
| Models | Governed model records, model versions, model cards, evaluation reports, weights, checkpoints, tokenizers, and other model artifacts. | Generic build artifacts that are not tied to a model product. |
| Docker / Helm | Docker images, Helm charts, and generic OCI artifacts that need registry-style push/pull and tag or digest management. | Python package indexes or model governance records. |
If an artifact is tied to a governed model product, start in the Model Repository. If it is a runtime dependency or deployable build artifact, use the Python, dbt/SQLMesh, or Docker/Helm tabs.
Scope Model
Python package and OCI repositories can be created at two scopes.
| Scope | Use it when |
|---|---|
| Space-wide | The artifact should be shared across the whole space, such as platform SDKs, common notebooks dependencies, base images, or shared Helm charts. |
| Project-scoped | The artifact should be limited to one project or workstream, such as a package used by a single authoring workspace or an image owned by one delivery team. |
Project scopes have their own access settings. The default space-member access can follow space roles or be restricted, and direct grants can be assigned to users or teams. Use project scopes when access to the artifact should be narrower than access to the space.
The Artifact Repositories page follows the selected space. If no space is selected, space-scoped tabs ask you to choose a space first. Python package and OCI tabs also depend on their package feature keys being enabled for the deployment or tier.
Python Packages
Private Python package repositories expose PyPI-compatible endpoints for pip
and twine. Use them for internal wheels, CLI packages, SDK builds, and
controlled dependency mirrors.
Repository admins can:
- Create space-wide or project-scoped repositories.
- Upload, yank, archive, or delete package files.
- Import exact package releases from public PyPI.
- Enable vulnerability scanning and install blocking policy.
Use an API key with Basic auth username __token__ when configuring package
clients. Developers can automate repository lifecycle, package files, public
PyPI imports, and scan policy through the
Python Package Repositories API.
Installing With pip
Use the repository's Simple API URL as the package index. Keep public PyPI as an
extra index when third-party dependencies should still resolve from pypi.org.
pip install <package-name> \
--index-url "https://__token__:<qk-api-key>@<qarion-host>/api/v1.0/pypi/spaces/<space-slug>/repositories/<repository-slug>/simple/" \
--extra-index-url "https://pypi.org/simple"
For a project-scoped repository, include the project slug:
pip install <package-name> \
--index-url "https://__token__:<qk-api-key>@<qarion-host>/api/v1.0/pypi/spaces/<space-slug>/projects/<project-slug>/repositories/<repository-slug>/simple/"
Prefer environment variables or a pip config file for routine use so API keys do not end up in shell history.
Publishing With twine
Use the repository's legacy upload URL in .pypirc.
[distutils]
index-servers =
qarion-space
[qarion-space]
repository = https://<qarion-host>/api/v1.0/pypi/spaces/<space-slug>/repositories/<repository-slug>/legacy/
username = __token__
password = <qk-api-key>
Then build and upload:
python -m build
twine upload --repository qarion-space dist/*
Uploads can also be performed from the UI or management API. Uploaded package files record filename, distribution type, size, SHA-256 digest, yanked state, upload time, and vulnerability scan state.
Public PyPI Imports
Repository admins can import an exact package version from public PyPI. The
import flow previews supported files for the release, including wheel Python,
ABI, and platform tags. Use tag filters when you only want files for a target
runtime, such as cp311, abi3, manylinux_2_17_x86_64,
macosx_11_0_arm64, or win_amd64.
Dependency mirroring is optional:
- Use dependency preview when you want to review the resolved direct and transitive artifacts before importing them.
- Use all resolved dependencies when the worker should re-resolve and import every mandatory dependency at execution time.
- Keep source distributions and universal wheels selected when they should remain installable across runtimes.
PyPI imports are asynchronous. If an import remains queued, ask an administrator to confirm the bulk worker queue is running.
Vulnerability Scanning And Install Blocking
Python package repositories can scan uploaded files for PyPI ecosystem vulnerabilities when platform scanning and the repository scan policy are both enabled. Scan results show resolved dependencies, advisory IDs, aliases such as CVE or GHSA IDs, severity, fixed versions, references, and whether the file is blocked.
Scan policies can:
- Choose OSV scanning and resolver target settings.
- Allow or disallow public PyPI during dependency resolution.
- Add unauthenticated extra package indexes.
- Run in report-only mode or block files by severity threshold.
- Decide whether pending or failed scans should block package-client installs.
Install blocking affects package clients only. Blocked files stay visible in the Qarion UI and management APIs, but they are omitted from Simple API indexes and direct package downloads return not found.
dbt And SQLMesh Packages
The dbt / SQLMesh tab catalogs transform package references for governed Transform Authoring work. Use it when transform authors need a reviewable list of packages they can import into dbt or SQLMesh projects.
Users can:
- Search private Qarion transform package entries.
- Add or update private dbt and SQLMesh package catalog entries.
- Attach entries to project repositories.
- Import public dbt packages into eligible project repositories.
- Copy package usage snippets for transform project configuration.
SQLMesh catalog entries must reference a repository. Public package import is available for dbt packages; SQLMesh references are managed as private catalog entries.
For the authoring workflow that consumes these package references, see Transform Models.
Model Artifacts
The Models tab opens the Model Repository inside the selected space. Use it for model metadata and artifacts that belong to governed AI or ML catalog products.
Model artifacts include binaries, weights, checkpoints, adapters, tokenizers, prompt bundles, evaluation reports, model cards, and other model-specific files or external references. They can be tied to model versions or training runs and can be marked current.
Use the Model Repository guide when you need to create model entries, upload model artifacts in chunks, verify checksums, or understand current artifact behavior.
OCI Repositories
OCI repositories can host Docker images, Helm charts, and generic OCI artifacts. Repositories can be space-wide or attached to project scopes with explicit user/team grants.
Repository users can:
- Log in with Docker or Helm using a Qarion API key.
- Push and pull Docker images or Helm charts.
- Browse artifacts, tags, manifests, and blobs.
- Import exact public Docker or Helm OCI references into a private repository.
Public import supports Docker Hub and Artifact Hub search helpers, but imports always require an exact source reference with a tag or digest.
Docker And Helm Login
Create a Qarion API key with the needed repository permissions, then use the
reserved username __token__.
printf '%s' "$QARION_API_KEY" | docker login <registry-host> -u __token__ --password-stdin
printf '%s' "$QARION_API_KEY" | helm registry login <registry-host> -u __token__ --password-stdin
The registry issues short-lived bearer tokens. Token actions are limited to the intersection of requested Docker or Helm actions and the user's Qarion permissions.
Docker Images
Tag images with the repository path shown in the UI, then push or pull with the standard Docker client.
docker tag app:local \
<registry-host>/spaces/<space-slug>/repositories/<repository-slug>/app:2026.06.29
docker push <registry-host>/spaces/<space-slug>/repositories/<repository-slug>/app:2026.06.29
docker pull <registry-host>/spaces/<space-slug>/repositories/<repository-slug>/app:2026.06.29
Docker image indexes and manifest lists are accepted. Manifest uploads must reference blobs that already exist in the same Qarion space.
Helm Charts
Push packaged charts to the repository URL shown in the UI.
helm package ./charts/platform
helm push ./platform-0.3.0.tgz \
oci://<registry-host>/spaces/<space-slug>/repositories/<repository-slug>
Helm dependencies can use the same OCI repository URL.
Public Registry Imports
Users with push access can import exact public Docker or Helm OCI references into a private Qarion repository. Search helpers can find Docker Hub images and Artifact Hub charts, but imports do not depend on search results. Automation can import directly with an exact reference.
Examples:
nginx:1.27
registry-1.docker.io/library/nginx:1.27
registry.example.com/platform/base@sha256:<digest>
oci://registry-1.docker.io/bitnamicharts/nginx:18.2.5
Public references must include a tag or digest and must not contain credentials. Imports are asynchronous and report status, progress, destination artifact name, destination reference, manifest digest, imported manifest count, imported blob count, and reused blob count.
If an import remains queued, ask an administrator to confirm the bulk worker queue is running.
Access And Safety
Use project-scoped repositories when a package or image should be limited to a specific project. Space-wide repositories are better for shared platform tools.
Keep package indexes and OCI repositories private by default. Missing or inaccessible packages, repositories, and artifacts return not-found responses to package and registry clients to avoid leaking scope details.
Use these access levels as a practical guide:
| Need | Python project access | OCI project access |
|---|---|---|
| Install or pull only | view | view |
| Publish packages or push artifacts | publish | push |
| Manage repository metadata | edit | edit |
| Manage grants and high-risk settings | admin | admin |
For space-wide repositories, the same concepts are enforced through space RBAC on the Python package repository or OCI registry repository resource.
Worker And Platform Dependencies
Some actions are accepted by the API and completed by workers:
| Workflow | Worker behavior |
|---|---|
| Public PyPI import | Runs on the bulk queue and imports selected package files and optional dependencies. |
| Python package vulnerability scan | Runs on the bulk queue, resolves dependencies, queries OSV, and applies scan policy. |
| Public OCI import | Runs on the bulk queue and fetches manifests and blobs from public registries. |
If these jobs stay queued, the relevant worker is not running or cannot reach the queue. Administrators should check worker mode, bulk queue configuration, temporary filesystem capacity, and public registry or PyPI egress settings.
Troubleshooting
| Symptom | What to check |
|---|---|
| The Artifact Repositories tab is unavailable. | Confirm the selected tier or deployment enables the Python package or OCI registry feature key. |
| A repository is missing from the list. | Check the selected space, scope filter, archived toggle, and project-scope access. |
pip or twine cannot authenticate. | Use Basic auth username __token__ and a Qarion API key as the password. Avoid personal account passwords. |
pip cannot find a package that exists in the UI. | Check yanked state, vulnerability blocking, project scope, Simple API URL, package name normalization, and whether public PyPI should be added as an extra index. |
| A PyPI import is stuck. | Confirm the bulk worker queue is running and that public PyPI access is allowed from the worker. |
| A vulnerability scan stays pending. | Confirm platform scanning is enabled, repository scan policy is enabled, and the scan worker can resolve dependencies. |
Docker or Helm login returns 401. | Log in again with __token__ and a valid API key; registry bearer tokens are short lived. |
Docker or Helm push returns 403. | Confirm the user has push access for the space-wide repository or project scope. |
OCI import returns 422. | Confirm the source reference includes a tag or digest, Helm references use oci://, and destination overrides are valid. |
| OCI upload reports a blob or digest error. | Confirm the uploaded bytes match the sha256: digest and that referenced blobs exist in the same Qarion space. |
Related Operations
Maintainers can find deployment-level details in the repository operations docs:
docs/operations/oci-registries.md and
docs/operations/python-package-repositories.md.
Related docs: