Vaulthalla Logo

Signed Push

Send signed dry-run and sync requests to the Payload endpoint.

Signed Push

payload-markdown-docs push builds a manifest, validates it locally, authenticates the upload, and posts it to the configured endpoint.

Two auth modes are supported:

  • Ed25519 request signing for provider-neutral CI/local workflows.
  • GitHub OIDC bearer auth for GitHub Actions without a long-lived private key.

Dry Run

1pnpm exec payload-markdown-docs push \2  --endpoint "$DOCS_SYNC_ENDPOINT" \3  --source main-docs \4  --key-id github-actions-main \5  --private-key-file .docs-sync/docs-sync-private.pem \6  --dry-run

Dry-run is an explicit validation-only mode. Without --dry-run, push defaults to sync mode.

Sync

1pnpm exec payload-markdown-docs push \2  --endpoint "$DOCS_SYNC_ENDPOINT" \3  --source main-docs \4  --key-id github-actions-main \5  --private-key-env DOCS_SYNC_PRIVATE_KEY

Sync mode requires sync.allowWrites: true on the server.

Ed25519 Request Headers

In Ed25519 mode, the CLI sends:

1X-VL-MD-DOCS-Key-Id2X-VL-MD-DOCS-Timestamp3X-VL-MD-DOCS-Nonce4X-VL-MD-DOCS-Body-SHA2565X-VL-MD-DOCS-Signature6Content-Type: application/json

The endpoint reads the manifest source, resolves the matching docs set, and then verifies the request against the global Keys collection before it applies the manifest.

Private keys may be CLI-generated PKCS#8 PEM/base64 keys or unencrypted OpenSSH Ed25519 private keys. Public keys in Docs Globals > Keys may be PKCS#8/SPKI public keys from keygen or ssh-ed25519 ... OpenSSH public keys.

GitHub OIDC

1pnpm exec payload-markdown-docs push \2  --endpoint "$DOCS_SYNC_ENDPOINT" \3  --source main-docs \4  --github-oidc

In OIDC mode, the CLI sends:

1Authorization: Bearer <github-oidc-jwt>2X-VL-MD-DOCS-Body-SHA2563Content-Type: application/json

OIDC is bearer authentication, not a body signature. The server resolves the docs set, verifies the JWT against GitHub's JWKS, checks docs-set claim branch plus global Trusted owner/repository records, checks the body hash, and uses the token jti for replay protection.

See the security model.