Fundamentals
Bundle Format
How .oxp bundles are packed, signed, distributed, and verified.
OXP bundles are OCI artifacts signed with Sigstore (or Ed25519 for offline use). Both standards are adopted verbatim — OXP adds only the manifest schema and artifact media types.
The .oxp File
A .oxp file is a POSIX tar archive compressed with zstd level 19.
Key properties:
- **
oxp.jsonis always the first tar entry** — enables streaming validation - Entries are in lexicographic order — deterministic builds
- **All mtimes are
1980-01-01T00:00:00Z** — identical inputs produce identical hashes - **Modes:
0644for files,0755for directories** — reproducible
Bundle Digest
The digest is the SHA-256 of the uncompressed tar stream (not the compressed file). This is stable across recompression and matches how OCI content-addresses layers.
Per-File Integrity
oxp publish generates .oxp/integrity.json:
{
"specVersion": "1",
"algorithm": "sha-256",
"files": {
"oxp.json": "e3b0c44...",
"ui/index.html": "a4d2...",
"wasm/core.wasm": "9b1c..."
}
}Hosts verify per-file digests on extract. Mismatches are hard errors.
Signing
Ed25519 (default, offline-capable)
Every oxp pack signs the bundle digest with an Ed25519 key stored at ~/.oxp/keys/. The signature is written to .oxp/SIGNATURE:
{
"alg": "ed25519",
"keyId": "ed25519:0x...",
"signature": "base64...",
"payload": { "digest": "sha256:...", "signedAt": "rfc3339" }
}Sigstore (keyless, transparency-logged)
For maximum trust, OXP supports Sigstore keyless signing. The signature includes a Fulcio certificate, OIDC identity proof, and Rekor inclusion proof.
OCI Representation
OXP bundles are stored in any OCI-compliant registry. Media types:
| Media Type | Purpose |
|---|---|
application/vnd.oxp.config.v1+json | OCI config (copy of oxp.json) |
application/vnd.oxp.bundle.v1.tar+zstd | The .oxp archive layer |
application/vnd.oxp.signature.v1+json | Sigstore/Ed25519 signature |
This means Docker Hub, GHCR, ECR, GAR, Harbor, and any OCI registry can host OXP bundles. Mirroring is a single command:
oras copy oci.oxp.sh/acme/postgres:1.4.2 internal.corp/oxp/acme/postgres:1.4.2Size Limits
| Limit | Value |
|---|---|
| Total uncompressed bundle | 64 MiB |
| Individual file | 16 MiB |
| File count | 2,000 |
| UI directory (gzipped) | 300 KiB |
| Wasm component | 8 MiB |