Signing a Flows custom app proves who built the bundle and binds the signature to the exact bytes deployed. The platform rejects the deployment if anything in the bundle changes after signing, or if the signing key isn’t registered. Use this guide if you’re a certified Flows builder and you deploy custom apps with the Cognite CLI.Documentation Index
Fetch the complete documentation index at: https://docs.cognite.com/llms.txt
Use this file to discover all available pages before exploring further.
Signatures required to publish
Before you publish a Flows custom app, the platform may require a developer signature, an app certification signature, or both. Each signature is tied to the exact bundle bytes. Use the table to see what each one proves. This guide walks you through the developer signature only.| Signature | What it proves |
|---|---|
| Developer signature | A certified developer built this bundle for this CDF project. |
| App certification signature | Cognite has reviewed and approved this production bundle. |
Request Dev status for a CDF project
Prerequisites
- The latest Cognite CLI (
npx @cognite/cli@latest). - A Flows custom app with
app.json(withinfraset toappsApi). - Access to the CDF project you’ll deploy to.
- Builder certification, or signing instructions from the team reviewing your app.
Sign and publish
Generate a signing key
kid), the email tied to the key, and an expiry. On macOS, it stores the private key in Keychain by default and writes the public key to ~/.cognite-cli/keys/<kid>.pub.pem so you can share it for registration.Register the public key
keys generate finishes by printing a pre-filled Zendesk URL for registration. Pick one when prompted:- Open in browser — submits the request directly.
- Copy link — paste it into the browser later. Pass
--copy-linkto skip the prompt and copy straight to the clipboard.
kid, email, expiry, and the YAML block Cognite needs to add to the public key registry. You can publish before the key is registered, but apps status will show your signature as KEY_NOT_IN_REGISTRY until Cognite adds it to the registry.Build and deploy
apps deploy packages dist/, uploads it as a DRAFT, and keeps a copy of the exact bytes at .cognite-bundles/<externalId>-<versionTag>.zip so signing operates on what the platform actually received. The app scaffold gitignores .cognite-bundles/. Don’t commit bundle files from that folder.Sign the bundle
apps sign picks app.json’s externalId and versionTag, finds the matching .cognite-bundles/<app>-<version>.zip, writes <bundle>.dev.sig next to it, and submits the signature to the platform. Override with --signing-identity <kid>, --scope <org>/<project>, or an explicit bundle path.Run apps status to verify the signature was accepted before you publish.Publish
apps publish transitions the version from DRAFT to PUBLISHED. Signatures were already submitted by apps sign; publish re-submits any local .dev.sig (and .cert.sig if present) as a safety net, then flips the lifecycle state.Confirm
kid), the role (developer or certifier), the time the signature was issued, and the platform’s verdict.You’ll see one of three shapes depending on where you are in the flow:Before apps deploy:apps deploy, before apps sign + apps publish:| Verdict | What it means | What to do |
|---|---|---|
VALID | Signature verifies and the key is in the registry and in date. | Nothing — this is the expected state. |
REVOKED | The signing key has been revoked since the signature was submitted. | Re-sign with a current key, then publish a new version. |
EXPIRED | The signing key was in date when signed, but has since expired. | Rotate the key (see Rotate or replace a key) and re-sign. |
SIGNED_BEFORE_KEY_ISSUED | The signature’s iat timestamp predates the key’s registration. Clock skew, or a stale key. | Re-sign with the current system clock. If the clock is correct, contact Cognite. |
IAT_IN_FUTURE | The signature’s iat timestamp is in the future. Usually clock skew on the signing machine. | Fix the signing machine’s clock, then re-sign and re-publish. |
BUNDLE_TOO_OLD | The bundle’s signature is older than the platform’s minimum-age policy. | Re-sign the current bundle and re-publish. |
KEY_NOT_IN_REGISTRY | The kid you signed with isn’t in the registry. | Confirm the key is registered before re-signing. |
VALID for the expected kid. Anything else needs action before the version will serve.Production certification (Cognite signature)
Production CDF projects without Dev status need both a developer signature and an app certification signature. The two signatures are independent — Cognite signs the same bundle bytes with their own key and returns the signature to you. Complete the Sign and publish steps until Publish, then add these steps before you publish the application:Submit the app for review
apps submit packages a source archive (src-<sha>.zip), copies the deploy bundle into dist/submit/, and opens a pre-filled Zendesk request with the app metadata. Attach everything in dist/submit/ plus a screen recording of the app, then submit.Receive the certification signature from Cognite
.cert.sig file. Save it to your app’s .cognite-bundles/ folder next to the deploy bundle, named <externalId>-<versionTag>.cert.sig.For example, for app sign-test-app version 0.0.3:.cognite-bundles/ in your file manager from the app folder:- macOS
- Windows
- Linux
.cert.sig to git. The scaffold gitignores .cognite-bundles/ for this reason.Sign again when the bundle changes
The signature is bound to the exact bytes of the bundle. Anything that changes the bundle invalidates the signature:- Re-running
npm run build. - Editing files in
dist/ormanifest.json. - Bumping the app version.
apps deploy, apps sign, and apps publish in order. deploy overwrites the bundle file at the same path, so the next sign picks up the new bytes automatically.
Rotate or replace a key
Generate a new key when the old one expires, you move to a new machine, or you suspect the private key is compromised:npx @cognite/cli@latest keys generate.- Register the new public key.
- Sign new bundles with the new key.
- Ask your Cognite contact to revoke the old key if needed.
Troubleshooting
No signing identities were found
No signing identities were found
npx @cognite/cli@latest keys generate, then retry the signing command.Publish fails with `bundle hash mismatch`
Publish fails with `bundle hash mismatch`
npx @cognite/cli@latest apps deploy— refreshes.cognite-bundles/<app>-<version>.zipwith the bytes the platform has.npx @cognite/cli@latest apps sign— signs the refreshed bundle.npx @cognite/cli@latest apps publish .— submits the new signature.
`apps status` shows ❌ KEY_NOT_IN_REGISTRY
`apps status` shows ❌ KEY_NOT_IN_REGISTRY
apps status — the verdict flips to VALID once the registry catches up. No need to re-sign or re-publish.`apps status` shows ❌ IAT_IN_FUTURE or SIGNED_BEFORE_KEY_ISSUED
`apps status` shows ❌ IAT_IN_FUTURE or SIGNED_BEFORE_KEY_ISSUED
apps sign and apps publish.Publish fails with `two signatures required`
Publish fails with `two signatures required`
.cert.sig Cognite returns.Multiple signing keys
Multiple signing keys
npx @cognite/cli@latest keys list, find the correct kid, and pass it with --signing-identity <kid>.Lost access to Mac or Keychain
Lost access to Mac or Keychain