Integrations

Every action call uses one typed request/result contract, but transport security, retry, settlement, and idempotency remain provider-specific. A service declaration selects a host-registered transport; workflow YAML cannot import code or invent endpoints.

Direct Python

direct invokes a trusted BaseAction in the worker process. It is fast and receives only declared resources, but it is not a hostile-code sandbox: action code has the worker process's privileges. Retries can repeat side effects, so actions must use request identity for idempotency.

Declared TransportError and ResourceOperationError retryability is preserved across direct actions. An unexpected application exception receives a safe error message, without its raw body.

from justflow import BaseAction


class InventoryActions(BaseAction):
    async def reserve(self, order_ref: str) -> dict[str, object]:
        return {"order_ref": order_ref, "reserved": True}

HTTPS

The HTTPS transport uses a fixed validated base URL, bounded request/response bodies, connection and dispatch deadlines, and an origin allowlist. Production endpoints require HTTPS. Authentication is supplied by the host boundary; definitions must not contain tokens. Treat a timeout as unknown external outcome and make the receiver idempotent before enabling retries.

Responses are streamed up to max_response_bytes (512 KiB by default), under an overall request deadline, and closed on failure or cancellation. The transport requests identity encoding and rejects compressed responses; configure the upstream to honor that requirement.

TLS gRPC

Install justflow[grpc]. A service selects a named TLS profile from typed runtime settings; server name, trust roots, and optional client identity are host-owned. Message sizes and deadlines are bounded. TLS authenticates and protects the connection, not payloads retained by either system.

The built-in adapter supports JSON request/response bytes over unary RPCs. It is not a generated Protobuf client and does not implement streaming RPCs. Use a custom transport for those contracts. Concurrent connection attempts share one channel, and failed or canceled readiness closes it.

Lambda

Install justflow[aws]. Lambda invocation uses workload identity and a configured function target, never static AWS keys. Retry and timeout can outlive the caller's certainty about execution, so the function must deduplicate durable side effects. Lambda is available for evaluation in 0.1; its operational contract is not yet stable.

Queue and broker calls

The queue transport publishes through an explicitly registered broker such as SQS. Logical destinations resolve in typed runtime configuration; queue URLs, receipt handles, credentials, and polling policy do not enter service YAML. Trigger and response consumers require dead-letter destinations.

Delivery is at-least-once. Activity retries reuse the same message identity. idempotency: durable requires the receiving service to persist identity-to-result and replay the stored response; idempotency: none permits repeated side effects. Acknowledgement happens only after the matching Temporal start or signal succeeds. Malformed, permanently unrouteable, and exhausted messages go to the configured dead-letter destination.

Resources

Built-ins cover memory and S3 archives, S3 objects, DynamoDB, Secrets Manager, SSM, PostgreSQL, Redis, and static configuration. Resource capabilities are checked before startup. Direct actions receive only their declared resource names, and initialization/cleanup follows dependency order.

AWS resources use workload identity. PostgreSQL/Redis can resolve credentials from a named runtime secret or a secret-reader resource. Secret values remain outside declarations, definition identity, diagnostics, and logs.

S3 object and catalog reads enforce byte limits while consuming the stream and close the body even on rejection. Catalog metadata has a separate 64 MiB document ceiling. PostgreSQL reads use a transaction-owned cursor, fetch one row ahead, and reject results exceeding max_rows or max_result_bytes before retaining an unbounded collection. The command deadline includes pool acquisition and consumption. Each row is decoded by the database driver before its byte check; select bounded columns and paginate large datasets rather than reading arbitrary large fields. Initialization failure closes the failing resource and previously initialized resources.

Payload protection

payload_protection.mode: codec requires a host-provided PayloadProtectionBinding backed by an AuthenticatedPayloadCipher. The cipher is an AEAD boundary: encryption and decryption receive canonical associated data that binds the format version, key identity, and payload kind. A provider must reject modified ciphertext, associated data, or authentication tags; successful plaintext parsing is not an integrity check.

Temporal payloads and encrypted audit archives use format version 2. active_key_id selects the write key and every key in readable_key_ids remains available for reads. Retain the worker build and keys needed by every supported open history and archive. Codec mode fails closed when metadata, version, key availability, authentication, or plaintext decoding is invalid.

Webhooks, CloudEvents, and host registration

A webhook source must verify authenticity before mapping a bounded payload. A CloudEvent mapper validates event type/source and preserves provider event identity for deterministic start deduplication. A host adapter can expose application-native ingress but must assign scope from trusted registration, not request data.

RuntimeApplication is the composition seam for registries, authentication, catalog, configuration, payload protection, Temporal credentials, webhook sources, and CloudEvent mappings. See the maintained host application and custom provider guide.

Unsupported integration shortcuts

OWS import, arbitrary external Temporal activities, filesystem watch mode, Markdown injection, visual editing, and AI workflow building are not 0.1 capabilities. Generate declarations in your own tooling, then validate them against the public schemas and justflow validate boundary.