Sure, Chef's got everyone talking, but the Convex crew has been busy cooking up some awesome enhancements to our core platform! Dive in and see what's fresh:

Better file storage UI in the dashboard

Some of our apps (ahem, Chef) have a large number of files. We’ve updated the dashboard to make it easier to deal with large lists of files. You can now filter files by ID and pause fast updates.

Screenshot 2025-05-28 at 11.40.19 AM.png

Faster function starts

Convex just got faster for everyone. Every function call now has reduced system overhead, and projects with large schemas will benefit from better internal caching. Check out one of our internal charts:

New and updated components

The team has been cranking away at making components that help you build high-quality products faster. There is now a component for building Agents, getting payments from Polar, doing Persistent Text Streaming for AI apps, Workflows are no longer in beta, and Workpool is more performant.

Components are higher-level building blocks that run in their own sandboxed environment in Convex. Check out all the components Convex has to offer.

Custom JWT-based Authentication

Convex deployments now support authentication via other types of JWTs beyond OpenID Connect ID tokens.

To opt into accepting these JWT tokens, add a provider to your convex/auth.config.ts file with type: "customJwt". Since the structure of these fields isn’t standardized like OIDC OpenID, you’ll find whatever subfields of the properties fields available on the user identity object returned from ctx.auth.getUserIdentity(). Read the docs.

More crypto options in Convex functions

AES-GCM in SubleCrypto

AES-GCM is now available through SubtleCrypto. You can now use symmetric encryption and decryption in Convex functions:

await crypto.subtle.encrypt({ name: "AES-GCM", iv }, key, data);

The key has to be 128 or 256 bits, and the API conforms to https://developer.mozilla.org/en-US/docs/Web/API/AesGcmParams

Generating keypairs for asymmetric signatures

You can now generate keypairs for asymmetric signatures in Convex actions:

const { privateKey, publicKey } =
	await crypto.subtle.generateKey(
		"Ed25519" /* or other algorithms */,
		true /* extractable */,
		["sign", "verify"],
	);
const signature = await crypto.subtle.sign("Ed25519", privateKey, data);
  • Supported algorithms are RSASSA-PKCS1-v1_5 , RSA-PSS, ECDSA with P256 or P384, and Ed25519.
  • Conforms to https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/generateKey
  • Only available in actions currently (for determinism/security reasons)
  • Also, signing and verification (crypto.subtle.sign / crypto.subtle.verify) are now generally available for all those algorithms. Verification is available everywhere; signatures only in actions.

retry_count in log streams

You can gain better visibility into how your project is performing by examining log streams to see how often mutations have automatically retried. This is an important signal to determine if you have major write conflicts (OCC errors) in your project. See everything you get in log streams.