Skip to content
whisk
FeaturesGuidesDocsPricingStatus
Sign in
whisk
FeaturesDocsGuidesComparisonsLearnSkillStatusSecurityContact
TermsAcceptable usePrivacyData processingTakedown
  • Getting started
  • The rules
  • Manifest
  • Headers
  • Environment
  • Errors
  • Doctor rules
  • CLI reference

Files

  • SKILL.md
  • whisk.schema.json
  • graph.schema.json
  • webhook-presets.yaml

Manifest

whisk.yaml at the repository root declares the app: the name, which routes are public, the database, secrets by name, functions, webhooks, storage and the rest. Everything below is read from whisk.schema.json, which whisk doctor validates against and whisk schema prints. Required fields are marked.

Manifest fields
FieldTypeDefaultMeaning
whiskrequiredexactly 1Conventions version this repository follows. Changes within a version are additive.
namerequiredstring matching ^[a-z0-9]([a-z0-9-]*[a-z0-9])?$App slug. The hostname <name>.<org>.whisk.page derives from it.
routesobjectnone
routes.publiclist of string matching ^/[^?#\s]*$noneRoute globs reachable without identity. Everything else requires a signed-in team or customer identity.
routes.challengelist of string matching ^/[^?#\s]*$nonePublic routes whose POSTs must carry a solved Altcha challenge.
routes.csrf_offlist of string matching ^/[^?#\s]*$noneRoutes exempt from the platform CSRF check. Rare; for embeds.
routes.headersmap of stringnoneResponse headers to add or override on every response from this app.
healthobjectnone
health.pathstring matching ^/[^?#\s]*$"/health"An absolute URL path without query or fragment.
health.timeoutinteger90Seconds allowed from container start to the first 200 from the health path.
databasestring matching ^(app|none|shared:[a-z0-9]([a-z0-9-]*[a-z0-9])?)$"app"app: one database per app. shared:<name>: a schema inside an org-shared database. none: no database.
migratestringCommand run before traffic switches to a new deploy. A snapshot is taken first.
buildobjectnone
build.dockerfilestringPath to a Dockerfile. Absent: the platform detects the stack with Railpack.
build.secretslist of string matching ^[A-Z][A-Z0-9_]{1,63}$noneSecret names available only at build time, as BuildKit secret mounts.
secretslist of string matching ^[A-Z][A-Z0-9_]{1,63}$noneNames of secrets the app reads from the environment. Humans set values in the dashboard.
envmap of stringnoneNon-secret configuration injected into the environment.
queueobjectnone
queue.endpointstring matching ^/[^?#\s]*$"/.whisk/inngest"Path where the platform delivers function runs using the Inngest protocol.
functionslist of any or anynone
functions[].namerequiredstring matching ^[a-z0-9]([a-z0-9-]*[a-z0-9])?$
functions[].cronstring matching ^\S+\s+\S+\s+\S+\s+\S+\s+\S+$Five-field cron expression, evaluated in tz (default UTC).
functions[].tzstring matching ^[A-Za-z_]+(/[A-Za-z0-9_+-]+)*$IANA time zone name for cron, for example Pacific/Auckland.
functions[].eventstring matching ^[a-z0-9]+([._/-][a-z0-9]+)*$Event name that triggers this function, for example po.created.
functions[].graphrequiredstring matching ^(([^/.][^/]*|\.[^/.][^/]*|\.\.[^/]+|\.)/)*[^/]*\.graph\.ya?ml$Path, relative to the repository root, of the declared workflow graph. No segment may be "..".
functions[].concurrencyinteger
functions[].retriesinteger3
webhookslist of objectnone
webhooks[].namerequiredstring matching ^[a-z0-9]([a-z0-9-]*[a-z0-9])?$
webhooks[].presetrequiredstring matching ^[a-z0-9]([a-z0-9-]*[a-z0-9])?$A preset name from webhook-presets.yaml, hmac with inline settings, or token for unsigned providers.
webhooks[].secretstring matching ^[A-Z][A-Z0-9_]{1,63}$Name of the secret holding the signing secret. Must also appear in secrets.
webhooks[].handlerrequiredstring matching ^/[^?#\s]*$Route in this app that receives verified deliveries. Reached only by the platform.
webhooks[].ip_allowlistlist of string matching ^([0-9]{1,3}\.){3}[0-9]{1,3}(/[0-9]{1,2})?$|^[0-9a-fA-F:]+(/[0-9]{1,3})?$none
webhooks[].hmacobjectInline signature settings for preset hmac. Same fields as a preset in webhook-presets.yaml.
webhooks[].hmac.headerrequiredstring matching ^[A-Za-z][A-Za-z0-9-]*$
webhooks[].hmac.algorithmrequired"sha1" | "sha256" | "sha512"
webhooks[].hmac.encodingrequired"hex" | "base64"
webhooks[].hmac.payloadrequiredstring
webhooks[].hmac.timestampobject
webhooks[].hmac.timestamp.fromrequired"header" | "header_name"
webhooks[].hmac.timestamp.namestring matching ^[A-Za-z][A-Za-z0-9-]*$
webhooks[].hmac.timestamp.patternstring
webhooks[].hmac.timestamp_format"unix" | "unix_ms" | "rfc3339""unix"
webhooks[].hmac.idobject
webhooks[].hmac.id.fromrequired"header" | "header_name"
webhooks[].hmac.id.namestring matching ^[A-Za-z][A-Za-z0-9-]*$
webhooks[].hmac.id.patternstring
webhooks[].hmac.signature_patternstring
webhooks[].hmac.signature_prefixstring
webhooks[].hmac.tolerance_secondsinteger
staticlist of objectnoneFolders published to object storage at deploy and served with immutable caching.
static[].dirrequiredstring matching ^(([^/.][^/]*|\.[^/.][^/]*|\.\.[^/]+|\.)/)*([^/.][^/]*|\.[^/.][^/]*|\.\.[^/]+|\.)/?$Folder, relative to the repository root, whose files are published. No segment may be "..".
static[].pathrequiredstring matching ^/[^?#\s]*$An absolute URL path without query or fragment.
storagebooleanfalsetrue requests a bucket prefix and injects WHISK_STORAGE_*.
kvbooleanfalsetrue gives this app a Valkey of its own as WHISK_KV_URL. Plan-gated.
emailbooleanfalsetrue allows this app to POST to the email send API.
always_onbooleanfalsetrue keeps the app awake. Plan-gated.
callslist of string matching ^[a-z0-9]([a-z0-9-]*[a-z0-9])?$noneSlugs of apps in the same org this app may call with its service identity.
network"internal" | "public"Where the app is served on Whisk On-Premise: internal (the default there) on the company's network only, public also on the outside address. whisk.run serves every app publicly and refuses internal.
customer_identity"none" | "app" | "org""none"Second audience for public-facing apps: none, a pool per app, or a pool shared across the org.
previewsobjectnone
previews.database"empty""empty"Previews start with an empty database; empty is the only value. Seed test data from the app's migrations or a script.
previews.ttl_daysinteger3Days a preview lives after its last push, start or visit.