cytario-app-sdk
A small CLI for registering Cytario analysis applications in an OCI Distribution v1.1 registry (e.g. Harbor 2.13+).
Cytario's "app catalog" is our concept, not the registry's: an analysis
application is a container image plus a metadata document (the app-definition)
that declares the app's parameter schema and input/output data roles. The SDK
attaches the app-definition to the container image as an OCI Image Format
annotation (org.cytario.appdef.v1) on the image manifest, then PUTs the
manifest back under its original tag. Because the annotation is part of the
manifest content, the manifest's immutable content digest binds the definition
to the exact image — pinning the image by digest also pins the definition. The
Cytario runtime fetches the manifest via GET /v2/<name>/manifests/<ref> and
reads the definition from its annotations; no Harbor-specific API is used.
Application access (who may see/run an app, who may edit its saved configs) is not part of the app-definition. Entitlement is governed by the catalog connection's access scope on the Cytario side, not by anything carried in the registry image.
Install
pip install cytario-app-sdk
cytario-app-sdk --help
Or with uv:
uv tool install cytario-app-sdk
Quick start
cytario-app-sdk --registry https://harbor.example.com \
--user 'robot$cytario-catalog' \
--secret <robot-token> \
register examples/cellseg.yaml
Connection settings (registry endpoint, user, secret) can be supplied on the command line or via a YAML config file consumed by typer-config:
# cytario-app-sdk.yaml
registry: https://harbor.example.com
user: robot$cytario-catalog
secret: <robot-token>
cytario-app-sdk --config cytario-app-sdk.yaml register examples/cellseg.yaml
Validate an app-definition without pushing anything:
cytario-app-sdk --config cytario-app-sdk.yaml register --dry-run examples/cellseg.yaml
Registering an app
# examples/cellseg.yaml
schemaVersion: 1
name: cellseg
display: Cell Segmentation
description: Runs Cellpose on a 16-bit OME-TIFF.
image:
repository: cytario/cellseg
tag: "1.0.0"
parameterSchema:
type: object
properties:
diameter:
type: number
default: 30
required: []
inputRoles:
- name: image
mediaTypes:
- image/tiff
outputRoles:
- name: segmentation
mediaTypes:
- application/vnd.cytario.label-mask
register fetches the container image manifest (by tag or digest), builds the
app-definition document, attaches it as the org.cytario.appdef.v1 annotation
on the manifest, and PUTs the manifest back under the original tag. The new
manifest digest (returned by the registry) pins both the image and the
definition. The Cytario runtime reads the annotation back via
GET /v2/<name>/manifests/<ref>; no Harbor-specific calls are made.
Development
This project uses uv and targets Python 3.10+.
uv sync # install deps into .venv
uv run cytario-app-sdk --help # run the CLI
uv run ruff check --fix && uv run ruff format
uv run pytest
See CONTRIBUTING.md for the full contributor guide and the
Releases page for release history. Versions are cut automatically
with python-semantic-release — in no-commit mode, so no release commits
land on main.
License
Released under the MIT License. By contributing, you agree that your contributions will be licensed under the MIT License.
Metadata
Release files for cytario-app-sdk 2.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cytario_app_sdk-2.0.0.tar.gz | 85.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cytario_app_sdk-2.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 101.9 kB
Release files / cytario_app_sdk-2.0.0.tar.gz
| Download URL | cytario_app_sdk-2.0.0.tar.gz |
|---|---|
| Size | 85.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ee0383cdfeb70d0043706fde86921a9d3b50605b2d0401e9bdf85a5bbf6ebc75
|
|
BLAKE2b-256 checksum How to use checksums |
ae03ec30a0ac9a057c34c981e65c792bc548d5d59bb89c655c1a3c183280b747
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 31, 2026.
Transparency logRelease files / cytario_app_sdk-2.0.0-py3-none-any.whl
| Download URL | cytario_app_sdk-2.0.0-py3-none-any.whl |
|---|---|
| Size | 16.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cd6793b00e44349cabd3e78a503ca315333493291e99fdc4b7ea20835fe1b61b
|
|
BLAKE2b-256 checksum How to use checksums |
cc1da4d492811beb3ae1a4c67fb9be11d6db8b536353a020437cbc8e7a98d1fc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 31, 2026.
Transparency log