Open Beta Archipelag.io is in open beta until June 2026. All credits and earnings are virtual. Read the announcement →

Publishing Cargos

How to build, submit, and certify your own cargos on the Archipelag.io network

Publishing Cargos

This guide covers the full lifecycle of publishing a Cargo on Archipelag.io — from building a container image to getting it certified and live on the network.

Cargo Tiers

Every Cargo on Archipelag.io falls into one of three publishing tiers. The tier determines visibility, trust level, and what resources the Cargo can access on Islands.

TierTrust LevelsSignatureNetwork AccessGPU AccessWho Can Publish
Community0 (Untrusted), 1 (Basic)Not requiredDisabledDisabledAny registered publisher
Certified2 (Verified)Required (cosign)DisabledDisabledVerified publishers with clean security scans
Official3 (Official)Required (cosign)EnabledEnabledFirst-party or fully audited Cargos
Start with Community
All new Cargos begin as Community tier. Build a track record of successful jobs and clean security scans to qualify for certification.

Community Cargos

Community Cargos are the entry point for any publisher. They run in a restricted sandbox with no network or GPU access, making them safe for the network while publishers establish trust.

  • Trust level 0 (Untrusted): Initial submission. Minimal sandbox — 256 MB memory, 60s timeout, 1 CPU, ~10 allowed syscalls.
  • Trust level 1 (Basic): After passing security scanning and code review. Standard sandbox — 1 GB memory, 300s timeout, 2 CPUs, ~140 allowed syscalls.

Community publishers can submit up to 3 active Cargos.

Certified Cargos

Certified Cargos have been verified by the Archipelag.io review team and are signed using cosign. The signature is recorded in the Rekor transparency log, providing a public audit trail.

Certification requirements:

  • Clean security scan (zero critical/high vulnerabilities)
  • Verified publisher identity
  • Container image signed with cosign
  • At least 100 successful job completions at Community tier
  • Reputation score above 0.8

Official Cargos

Official Cargos are first-party or fully audited workloads that run in the elevated sandbox tier. They can access GPU hardware and network resources on Islands. Official status is reserved for Cargos that have undergone a comprehensive audit by the Archipelag.io security team.

Official Cargos get elevated resources: 8 GB memory, 600s timeout, 4 CPUs, and GPU/Network seccomp profiles.

Submitting a Community Cargo

### Set up your environment Before you begin, make sure you have: - An Archipelag.io account with publisher access - Docker installed locally for building and testing - Familiarity with the [Cargo I/O protocol](/architecture/workloads/#io-protocol) ```bash # Verify your tools docker --version # For later certification: # cosign version ``` ### Build your container Your Cargo container must follow the Archipelag.io I/O protocol — read JSON from stdin, write JSON Lines to stdout: ```python #!/usr/bin/env python3 import sys import json # Read input from stdin input_data = json.loads(sys.stdin.read()) # Emit a status message print(json.dumps({"type": "status", "message": "Processing..."})) # Do work and stream results result = process(input_data) for token in result: print(json.dumps({"type": "token", "content": token})) # Signal completion print(json.dumps({"type": "done"})) ``` Use a minimal base image to reduce vulnerability surface: ```dockerfile FROM python:3.12-slim COPY app.py /app/app.py WORKDIR /app # No ENTRYPOINT with shell form — use exec form ENTRYPOINT ["python3", "app.py"] ``` {% warning(title="Keep images small") %} Large images slow down cold starts on Islands. Use multi-stage builds, `-slim` or `distroless` base images, and avoid including build tools in the final layer.

Test locally

Run your container with a test input to verify correctness under production-like constraints:

# Basic test
echo '{"prompt": "Hello"}' | docker run -i --rm your-cargo:latest

# Test with sandbox-equivalent resource limits
echo '{"prompt": "Hello"}' | docker run -i --rm \
  --memory=256m --cpus=1 --network=none \
  --read-only --tmpfs /tmp:size=64m \
  your-cargo:latest

Verify that:

  • The container reads JSON from stdin correctly
  • Each stdout line is valid JSON with a type field
  • A done or error message is emitted as the final line
  • The container exits with code 0 on success
  • The container runs within the restricted sandbox limits (256 MB, 1 CPU, no network)

Pre-scan for vulnerabilities

Run vulnerability scanners locally before submitting to avoid rejection:

# Trivy
trivy image your-cargo:latest

# Grype
grype your-cargo:latest

Fix all critical and high severity vulnerabilities. Medium severity findings should be justified or resolved.

Push to an approved registry

Push your container image to one of the approved registries:

# Tag with a semantic version
docker tag your-cargo:latest ghcr.io/archipelag-io/your-cargo:v1.0.0

# Push
docker push ghcr.io/archipelag-io/your-cargo:v1.0.0

Approved registries:

RegistryAddress
GitHub Container Registryghcr.io/archipelag-io
Docker Hubdocker.io/archipelag
Registry allowlist enforced
The Island software rejects container images from unapproved registries. Your image must be hosted on an approved registry before any Island can execute it.

Submit for review

Create a Cargo submission through the API or the web dashboard. Provide all required fields (see Cargo Definition Requirements below), then transition the submission from draft to pending_review.

# Example API submission
curl -X POST https://archipelag.io/api/v1/workloads \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "My Text Processor",
    "slug": "my-text-processor",
    "description": "Processes text input and returns structured output",
    "runtime_type": "container",
    "container_image": "ghcr.io/archipelag-io/my-text-processor:v1.0.0",
    "input_schema": {"type": "object", "properties": {"text": {"type": "string"}}},
    "output_schema": {"type": "object", "properties": {"result": {"type": "string"}}},
    "price_per_job": 1,
    "required_cpu_cores": 1,
    "required_ram_mb": 256
  }'

Wait for review

Once submitted, your Cargo enters the review pipeline:

  1. Automated security scan — Trivy and Grype analyze your container image
  2. SBOM generation — A Software Bill of Materials is created
  3. Manual review — A platform reviewer evaluates compliance, schemas, and resource requirements
  4. Trust level assignment — The reviewer assigns trust level 0 or 1

You will be notified of the outcome. If rejected, the rejection reason is provided so you can fix issues and resubmit.

{% end %}

Cargo Definition Requirements

Every Cargo submission must include the following metadata:

Required Fields

FieldTypeDescription
namestringHuman-readable Cargo name (e.g., “LLM Chat Mistral 7B”)
slugstringURL-safe identifier, unique across the platform (e.g., llm-chat-mistral)
descriptionstringClear description of what the Cargo does
runtime_typeenumExecution environment: container, wasm, coreml, or onnx
container_imagestringFull image reference including registry (e.g., ghcr.io/archipelag-io/llm-chat:v1.0.0)
input_schemaJSONJSON Schema describing expected input format
output_schemaJSONJSON Schema describing output format

Pricing (at least one required)

FieldTypeDescription
price_per_jobintegerFixed credit cost per job submission
price_per_tokenintegerCredit cost per output token (LLM Cargos)
price_per_secondintegerCredit cost per compute second

Resource Requirements (optional)

FieldTypeDefaultDescription
required_vram_mbinteger0Minimum GPU memory in MB
required_cpu_coresinteger1Minimum CPU cores
required_ram_mbinteger256Minimum system RAM in MB

Optional Metadata

FieldTypeDescription
categorystringDiscovery category (e.g., llm, image-gen, audio, text)
tagslistSearchable tags for Cargo Registry discovery
revenue_shareintegerIsland revenue share percentage (default: 70%)
image_digeststringSHA256 digest for integrity verification
Code identifiers use 'workload'
In the API and database, Cargos are represented as `workload` resources. The field names in API requests use `workload_id`, and the API endpoint is `/api/v1/workloads`. "Cargo" is the user-facing term; the code identifiers remain unchanged.

I/O Protocol

All Cargos communicate using a simple stdin/stdout JSON protocol, regardless of runtime type. This section is a brief overview — see the full I/O protocol reference for complete details.

Input: The Island sends a JSON object on stdin when the Cargo starts. The schema depends on the Cargo type (e.g., prompt + max_tokens for LLM Cargos).

Output: The Cargo emits JSON Lines on stdout. Each line must include a type field:

Output TypePurposeKey Fields
statusInformational updatesmessage
tokenStreaming text output (LLM)content
progressStep progressstep, total
imageCompleted image datadata (base64), format, width, height
doneSignals successful completionusage (optional)
errorSignals failuremessage
stdin (JSON) ──► Cargo ──► stdout (JSON Lines)
                            │
                            ├── {"type": "status", "message": "Loading model..."}
                            ├── {"type": "token", "content": "Hello"}
                            ├── {"type": "token", "content": " world"}
                            └── {"type": "done", "usage": {"tokens": 2}}

Output is streamed in real time through the Island software to the coordinator and then to the Consumer via WebSocket.

Always emit a terminal message
Every Cargo execution must end with either a `done` or `error` message. If the Cargo exits without a terminal message, the job is marked as failed by the Island software after the sandbox timeout expires.

Security Review Process

Every Cargo submission goes through a multi-stage security review before it can run on the Archipelag.io network.

Automated Scanning

Two vulnerability scanners run automatically when a submission enters pending_review:

ScannerWhat It Checks
TrivyOS packages, language dependencies (pip, npm, go modules, etc.)
GrypeContainer layers, known CVE database

Scan results are categorized by severity:

SeverityImpact
CriticalBlocks approval — must be fixed
HighBlocks approval — must be fixed
MediumFlagged for review — may require justification
LowInformational — does not block approval

A Software Bill of Materials (SBOM) is generated as part of the scan.

How to pre-scan locally
Run these tools before submitting to catch issues early: ```bash # Install scanners brew install trivy brew install grype # Scan your image trivy image --severity HIGH,CRITICAL your-cargo:latest grype your-cargo:latest --only-fixed # Common fixes: # - Update base image to latest patch version # - Pin and update language dependencies # - Use multi-stage builds to exclude build tools ```

Manual Review

After automated scanning, a platform reviewer evaluates:

  • Vulnerability scan results — all critical/high findings must be resolved
  • I/O protocol compliance — input/output schemas are well-defined
  • Resource requirements — requested resources are reasonable for the workload
  • Description and metadata — clear, accurate, and complete
  • Policy compliance — no prohibited content or functionality

Ongoing Monitoring

Published Cargos are not “set and forget”:

  • Weekly rescans — automated vulnerability scanning runs on all published Cargos
  • Reputation tracking — success rate, execution time, and complaint volume are monitored
  • Auto-suspension — Cargos with reputation below 0.5 or success rate below 90% (after 100+ jobs) are automatically suspended
  • Complaint flagging — Cargos with excessive consumer complaints are flagged for manual review

Trust Levels

Trust levels control what resources a Cargo can access when executing on Islands. Higher trust levels unlock more capabilities but require stronger verification.

Level 0 — Untrusted

The starting point for all new Cargos.

PropertyValue
SandboxRestricted
Memory256 MB
Timeout60 seconds
CPUs1
NetworkDisabled
GPUDisabled
SeccompMinimal (~10 syscalls)
SignatureNot required

What it unlocks: Basic compute tasks that fit within tight resource constraints. Good for text processing, simple transformations, and lightweight inference.

How to get here: Submit a Cargo. All new submissions start at level 0.

Level 1 — Basic

Reviewed Cargos with a clean security scan.

PropertyValue
SandboxStandard
Memory1 GB
Timeout300 seconds (5 min)
CPUs2
NetworkDisabled
GPUDisabled
SeccompDefault (~140 syscalls)
SignatureNot required

What it unlocks: More memory and time for heavier compute — quantized model inference, batch text processing, data transformation pipelines.

How to get here: Pass automated security scanning (zero critical/high vulnerabilities) and manual review.

Level 2 — Verified

Signed Cargos from verified publishers.

PropertyValue
SandboxStandard
Memory1 GB
Timeout300 seconds (5 min)
CPUs2
NetworkDisabled
GPUDisabled
SeccompDefault (~140 syscalls)
SignatureRequired (cosign)

What it unlocks: Same resource limits as level 1, but the cosign signature provides integrity guarantees. Islands verify the signature before execution, ensuring the Cargo has not been tampered with. Certified Cargos get a verified badge in the Cargo Registry.

How to get here:

  1. Maintain a reputation score above 0.8 at level 1
  2. Complete 100+ successful jobs
  3. Verify your publisher identity
  4. Sign your container image with cosign
Signing with cosign
```bash # Generate a key pair (one-time setup) cosign generate-key-pair # Sign your published image cosign sign --key cosign.key ghcr.io/archipelag-io/your-cargo:v1.0.0 # Verify the signature cosign verify --key cosign.pub ghcr.io/archipelag-io/your-cargo:v1.0.0 ``` The platform records: - `cosign_signature` — the signature value - `cosign_certificate` — the signing certificate - `cosign_log_index` — Rekor transparency log entry index - `signature_verified_at` — timestamp of last verification

Level 3 — Official

First-party or fully audited Cargos with elevated access.

PropertyValue
SandboxElevated
Memory8 GB
Timeout600 seconds (10 min)
CPUs4
NetworkEnabled
GPUEnabled
SeccompGPU or Network profile
SignatureRequired (cosign)

What it unlocks: Full GPU access for large model inference (LLMs, image generation, video processing). Network access for Cargos that need to fetch models or call external APIs. This is the tier for production AI workloads.

How to get here: Official status requires a comprehensive security audit by the Archipelag.io team. This tier is currently reserved for first-party Cargos and select partners.

Official status is not self-service
You cannot request Official status through the normal submission flow. Contact the Archipelag.io team if you believe your Cargo qualifies for elevated access.

Submission States

A Cargo submission progresses through these states:

draft ──► pending_review ──► approved ──► published
                │
                ▼
            rejected ──► (fix and resubmit as new draft)
StateMeaning
draftEditable — fill in details before submitting for review
pending_reviewIn the review queue — security scanning runs automatically
approvedPassed review — ready for signing (if required) and publishing
rejectedDid not pass review — see rejection reason, fix issues, resubmit
publishedLive in the Cargo Registry and available to Consumers

Updating Published Cargos

To update a published Cargo:

  1. Build and push a new container image version (use semantic versioning)
  2. Create a new submission referencing the updated image
  3. The new version goes through the same scan and review process
  4. Once approved, the new version replaces the previous one in the catalog
Use semantic version tags
Tag images as `v1.0.0`, `v1.1.0`, etc. rather than `latest`. This ensures reproducibility and makes rollbacks straightforward. Pin the digest (`@sha256:...`) for maximum integrity.

Best Practices

  • Minimal base images — use alpine, distroless, or -slim variants to reduce vulnerability surface
  • Pin all dependencies — lock versions in requirements.txt, package-lock.json, Cargo.lock, etc.
  • Multi-stage builds — keep compilers and build tools out of the final image layer
  • No secrets in images — never embed API keys, tokens, or credentials in container layers
  • Test with constraints — always test with --memory, --cpus, and --network=none flags locally
  • Pre-scan before submitting — run Trivy and Grype locally to catch vulnerabilities early
  • Handle stdin EOF — your Cargo must handle the case where stdin is empty or malformed gracefully
  • Emit clear errors — use the error output type with a descriptive message field when something goes wrong

Next Steps

{% card(title="Cargo Architecture", href="/architecture/workloads/") %} Deep dive into runtime types, I/O protocol, sandbox tiers, and pricing models.

Cargo Registry

Browse published Cargos and see what's available on the network.

API Reference

Full API documentation for programmatic Cargo submission and management.

{% end %}