Simplify your stack and build anything. Or everything.
Build tomorrow’s web with a modern solution you truly own.
Code-based nature means you can build on top of it to power anything.
It’s time to take back your content infrastructure.

New in Payload: Jobs, Content Modeling, and Lexical Improvements

Winter Release Roundup
Winter Release Roundup

From parallel background jobs to a dedicated slug field and a smarter rich text editor, v3.50 through v3.65 brought some of the most requested features to Payload's core. Here's what landed.

Parallel job queue tasks — v3.54

Tasks in Payload's job queue can now run in parallel rather than sequentially. This means multi-step background operations complete significantly faster, especially for workflows that process independent chunks of work — like generating multiple image sizes, sending batch notifications, or running scheduled imports.

1
// payload.config.ts
2
export default buildConfig({
3
jobs: {
4
tasks: [
5
{
6
slug: "resizeImage",
7
inputSchema: [{ name: "mediaId", type: "text", required: true }],
8
handler: async ({ input }) => {
9
// resize logic
10
},
11
},
12
{
13
slug: "generateThumbnail",
14
inputSchema: [{ name: "mediaId", type: "text", required: true }],
15
handler: async ({ input }) => {
16
// thumbnail logic
17
},
18
},
19
],
20
workflows: [
21
{
22
slug: "processUpload",
23
inputSchema: [{ name: "mediaId", type: "text", required: true }],
24
handler: async ({ job, tasks }) => {
25
// Both tasks now run in parallel
26
await Promise.all([
27
tasks.resizeImage({ input: { mediaId: job.input.mediaId } }),
28
tasks.generateThumbnail({ input: { mediaId: job.input.mediaId } }),
29
]);
30
},
31
},
32
],
33
},
34
});

Conditional blocks in Lexical — v3.57

Blocks in the Lexical editor can now be shown or hidden based on the values of other fields. This gives content editors a cleaner, context-aware editing experience and lets developers build content structures that adapt without cluttering the UI with irrelevant options.

1
// collections/Posts.ts
2
export const Posts: CollectionConfig = {
3
slug: "posts",
4
fields: [
5
{
6
name: "type",
7
type: "select",
8
options: ["standard", "premium"],
9
},
10
{
11
name: "content",
12
type: "blocks",
13
blocks: [StandardBlock, PremiumBlock],
14
admin: {
15
condition: (data, siblingData) => Boolean(siblingData?.type),
16
},
17
},
18
{
19
name: "premiumContent",
20
type: "blocks",
21
blocks: [PremiumBlock],
22
admin: {
23
condition: (data, siblingData) => siblingData?.type === "premium",
24
},
25
},
26
],
27
};

Drag-and-drop / copy-paste into Lexical — v3.57

You can now drag image files or other media directly from your desktop into the Lexical editor, or paste them straight from your clipboard. Previously this required uploading through the media browser first — now it works the way editors expect.

Slug field — v3.59

Payload now ships a dedicated slug field type. It generates a URL-safe slug from another field (typically the title), with built-in controls to lock or unlock it for manual editing. No more writing custom beforeChange hooks to manage slugs.

1
import { slugField } from "payload/fields";
2
3
export const Posts: CollectionConfig = {
4
slug: "posts",
5
fields: [
6
{
7
name: "title",
8
type: "text",
9
required: true,
10
},
11
slugField({
12
useAsSlug: "title",
13
required: true,
14
}),
15
],
16
};