Runtime capabilities

What an application supports, what it does not, and its limits.

The tables below list the current runtime capabilities of an application.

Publishing and deployment

CapabilityStatusNotes
Worker → version → deploymentSupportedCreating a version does not put it live; a deployment does. Set deploy: true when creating the version to do both in one step
RollbackSupportedCreate a deployment for an older version again; no files are re-uploaded
Whole-site replacementSupportedEach version's file manifest must list every file of the site; only files whose content changed are uploaded
Gradual rolloutNot supportedA deployment puts exactly one version at 100%
Retained versionsLimitThe latest 100 versions
Script sizeLimit10 MiB compressed
Deployment timeoutLimitA deployment that does not finish within 10 minutes fails

Static assets

CapabilityStatusNotes
Content-addressed deduplicationSupportedIdentical content is stored once; republishing does not upload it again
Paths and sizeLimitUp to 100000 files per version, 25 MiB per file
html_handlingSupportedauto-trailing-slash, force-trailing-slash, drop-trailing-slash or none
not_found_handlingSupportednone, 404-page or single-page-application
_headersSupportedApplies only to static asset responses; up to 100 rules, 2000 characters per line
_redirectsSupportedApplies only to static asset responses; up to 2000 static and 100 dynamic rules, 1000 characters per line

_headers and _redirects do not apply to responses your Worker code generates. For cross-origin access, set the CORS headers in code:

const CORS = {
  "access-control-allow-origin": "*",
  "access-control-allow-methods": "GET, POST, OPTIONS",
  "access-control-allow-headers": "content-type",
};

export default {
  async fetch(request) {
    if (request.method === "OPTIONS") return new Response(null, { status: 204, headers: CORS });
    return Response.json({ ok: true }, { headers: CORS });
  },
};

Outbound requests

CapabilityStatusNotes
Public addressesSupportedfetch() in your code can request any public address
Other applications on the platformSupportedRequesting another application's address returns that application's response

Bindings

TypeStatusNotes
d1SupportedDeclared when creating a version
kv_namespaceSupportedDeclared when creating a version
r2_bucketSupportedDeclared when creating a version
secret_textSupportedDeclared when creating a version; the value is written through the secrets endpoint
plain_textSupportedDeclared when creating a version
jsonSupportedDeclared when creating a version
praxis_tokenSupportedEnable platform API access as the owner organization; no token is injected
praxis_vault_refUnavailableCannot be used at the moment
Other types (such as service, queue, durable_object_namespace, ai)Not supportedCreating a version returns UNSUPPORTED

Secrets

CapabilityStatusNotes
Write a secretSupportedPUT /application/v1/workers/{id}/secrets/{name}. The write derives a new version from the current one and deploys it
Read a secret value backNot supportedValues are write-only; no endpoint returns them

Compatibility flags

CapabilityStatusNotes
compatibility_flagsSupportedPass them when creating a version; they take effect as given
global_fetch_strictly_publicAlways onAdded to every version and cannot be turned off; passing global_fetch_private_origin or no_global_fetch_strictly_public returns 400

Calling platform APIs

Declare this binding in the version you deploy:

{ "type": "praxis_token", "name": "PRAXIS_API_TOKEN" }

Your application can call the Develop API without an API key:

export default {
  async fetch() {
    return fetch("https://api-develop.deepraxis.com/application/v1/workers");
  }
};

The application has the same organization access as an API key of its owner organization. Resources of other organizations return not found. No token or secret is exposed to application code, and env.PRAXIS_API_TOKEN is not created. Without the binding, protected platform endpoints return 401 unless you supply your own valid credential. Other destination hosts are unchanged.

The Praxis SDK uses the same outbound path: omit apiKey and use the Develop API as its baseUrl. No SDK change is required. Existing applications must deploy a version with the binding to enable access. Removing the binding takes effect after the deployment becomes active and the routing cache refreshes (up to 10 seconds).

Export

On this page