Tech, Release notes 1.0.0
| Template | Tech, tpl_46549cf45b15 |
|---|---|
| Variant | Release notes |
| Version | 1.0.0, the newest: what a channel following this variant draws |
| Shapes | 9x16, 4x5, 1x1, 16x9, 2x3 |
| Length | 18 seconds |
Example video
The 1x1 cut of this version, drawn from its own worked example. Open the video on its own.
What it accepts
Release notes for a product or an app: the version, its date and headline, one to eight changes each marked new, improved, fixed or removed, and a call to action. The clip is as long as the changes need. metaData is the post's title, descriptions and hashtags and is never drawn.
| Field | Type | Required | Limit | What it is |
|---|---|---|---|---|
clipData | group | yes | Clip data: Everything drawn in the clip: the version and its date, the changes, the words for each kind of change and the call to action. | |
clipData.kicker | text | up to 32 characters | Product: A short line above the version, usually the product's or the app's name. | |
clipData.version | text | yes | up to 16 characters | Version: The version as it should be read, such as v4.2.0, 2026.10 or Release 12. |
clipData.headline | text | up to 64 characters | Headline: What this release is about, in a line. | |
clipData.date | text | up to 40 characters | Date: When it was released or reaches everybody, as it should be read. | |
clipData.changes | list | yes | at least 1, up to 8 | Changes: One to eight changes, shown one after another; the clip gets a little under two seconds longer for each. |
clipData.changes[] | group | Change | ||
clipData.changes[].kind | enum | new, improved, fixed, removed | Kind: What sort of change it is. Each kind has its own icon and colour; its word is set under Words for the kinds. | |
clipData.changes[].text | text | yes | up to 72 characters | Change: The change, in a short sentence. |
clipData.changes[].detail | text | up to 72 characters | Detail: One more line about it, such as who gets it or where to find it. | |
clipData.labels | group | Words for the kinds: The word shown with each kind of change, in the clip's language. Leave one out and that kind shows its icon alone. | ||
clipData.labels.new | text | up to 16 characters | New: The word for a change marked new. | |
clipData.labels.improved | text | up to 16 characters | Improved: The word for a change marked improved. | |
clipData.labels.fixed | text | up to 16 characters | Fixed: The word for a change marked fixed. | |
clipData.labels.removed | text | up to 16 characters | Removed: The word for a change marked removed. | |
clipData.picture | image | media:// file from the media library, alt text up to 120 characters | Picture: A screenshot of the release or the product, shown with the version at the start; any shape works. | |
clipData.cta | group | Call to action: The button at the end and the line under it, such as a web address, a handle or a phone number. | ||
clipData.cta.label | text | yes | up to 28 characters | Button: What the button says. |
clipData.cta.detail | text | up to 48 characters | Line under it: An address, a handle, a phone number. | |
clipData.disclaimer | text | up to 120 characters | Small print: A note that must be shown with the release, such as who gets it when. | |
clipData.look | group | Look: How the clip looks and moves. The same five switches in every format (theme, pace, corners, alignment, logo), plus this format's own. Leave any out for the format's default. | ||
clipData.look.theme | enum | brand, light, dark, bold | Theme: Brand: your brand's own colours and background. Light or dark: a page tinted with your brand colour. Bold: your brand colour as the page. | |
clipData.look.pace | enum | calm, standard, punchy | Pace: How things arrive: calm fades, a standard rhythm, or punchy slams and hard cuts. | |
clipData.look.corners | enum | square, soft, round | Corners: The shape of cards, pictures and buttons. | |
clipData.look.align | enum | start, centre | Text alignment: Where the text lines up. | |
clipData.look.layout | enum | log, cards | Layout: Log: the changes build up as a list along a line. Cards: one change at a time, large, on a deck of cards. | |
clipData.look.groupByKind | boolean | Group by kind: Show the new changes first, then the improved, fixed and removed ones, rather than in the order sent. | ||
clipData.look.logo | enum | auto, free | Logo: The style's own: the logo on the style's plate (a card, a disc, a badge) so it reads on any page. As it is: the logo whole, with no plate, frame or crop, for a logo made to stand on the page, such as one with a transparent background. As it is, make sure your logo reads on the page of the theme you choose. | |
metaData | group | Meta data: Everything about the post that is never drawn in the clip: its title, its description in four lengths, one per kind of platform, and its hashtags. Reelwire adds the brand's description, link and hashtags after it. Left out, the post text is generated from the clip data. | ||
metaData.title | text | up to 100 characters | Title: Used where the platform has a title of its own: Facebook Feed, LinkedIn, Pinterest and YouTube. Up to 100 characters, which every one of them takes. | |
metaData.captionTiny | text | up to 200 characters | Tiny description (Pinterest, Threads, X): Up to 200 characters. The brand's description, link and hashtags follow it within the platform's limit. | |
metaData.captionShort | text | up to 500 characters | Short description (Telegram, Threema, WeChat, WhatsApp): Up to 500 characters. The brand's description, link and hashtags follow it within the platform's limit. | |
metaData.captionMedium | text | up to 1500 characters | Medium description (Discord, Facebook Reels, Instagram, LinkedIn, Signal, Slack, TikTok): Up to 1500 characters. The brand's description, link and hashtags follow it within the platform's limit. | |
metaData.captionLong | text | up to 4000 characters | Long description (Facebook Feed, YouTube): Up to 4000 characters. The brand's description, link and hashtags follow it within the platform's limit. | |
metaData.hashtags | list | up to 15 | Hashtags: Written without the #. Up to 15, which every platform takes. | |
metaData.hashtags[] | text | up to 60 characters | Hashtag |
locales carries other languages: under each language code, the parts of clipData and metaData that differ, laid over the default, so a language with no copy still renders.
A picture is always a file from your media library: media:// followed by its id or its name.
Anything the table does not list is refused, and so is anything over its limit, with a 422 that
names the field.
The JSON Schema
{
"type": "object",
"properties": {
"clipData": {
"type": "object",
"properties": {
"kicker": {
"type": "string",
"maxLength": 32,
"title": "Product",
"description": "A short line above the version, usually the product's or the app's name."
},
"version": {
"type": "string",
"maxLength": 16,
"title": "Version",
"description": "The version as it should be read, such as v4.2.0, 2026.10 or Release 12."
},
"headline": {
"type": "string",
"maxLength": 64,
"title": "Headline",
"description": "What this release is about, in a line."
},
"date": {
"type": "string",
"maxLength": 40,
"title": "Date",
"description": "When it was released or reaches everybody, as it should be read."
},
"changes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"new",
"improved",
"fixed",
"removed"
],
"title": "Kind",
"description": "What sort of change it is. Each kind has its own icon and colour; its word is set under Words for the kinds.",
"enumNames": [
"New",
"Improved",
"Fixed",
"Removed"
]
},
"text": {
"type": "string",
"maxLength": 72,
"title": "Change",
"description": "The change, in a short sentence."
},
"detail": {
"type": "string",
"maxLength": 72,
"title": "Detail",
"description": "One more line about it, such as who gets it or where to find it."
}
},
"required": [
"text"
],
"additionalProperties": false,
"title": "Change"
},
"minItems": 1,
"maxItems": 8,
"title": "Changes",
"description": "One to eight changes, shown one after another; the clip gets a little under two seconds longer for each."
},
"labels": {
"type": "object",
"properties": {
"new": {
"type": "string",
"maxLength": 16,
"title": "New",
"description": "The word for a change marked new."
},
"improved": {
"type": "string",
"maxLength": 16,
"title": "Improved",
"description": "The word for a change marked improved."
},
"fixed": {
"type": "string",
"maxLength": 16,
"title": "Fixed",
"description": "The word for a change marked fixed."
},
"removed": {
"type": "string",
"maxLength": 16,
"title": "Removed",
"description": "The word for a change marked removed."
}
},
"additionalProperties": false,
"title": "Words for the kinds",
"description": "The word shown with each kind of change, in the clip's language. Leave one out and that kind shows its icon alone."
},
"picture": {
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"pattern": "^media:\\/\\/[^\\s/\\\\\\u0000-\\u001f][^/\\\\\\u0000-\\u001f]{0,254}$",
"title": "Picture",
"description": "A file from the workspace's media library, written media:// and the file's id or name. A web address is refused."
},
"alt": {
"type": "string",
"maxLength": 120,
"title": "Alt text",
"description": "What the picture shows, for anyone who cannot see it."
}
},
"required": [
"url"
],
"additionalProperties": false,
"title": "Picture",
"description": "A screenshot of the release or the product, shown with the version at the start; any shape works."
},
"cta": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 28,
"title": "Button",
"description": "What the button says."
},
"detail": {
"type": "string",
"maxLength": 48,
"title": "Line under it",
"description": "An address, a handle, a phone number."
}
},
"required": [
"label"
],
"additionalProperties": false,
"title": "Call to action",
"description": "The button at the end and the line under it, such as a web address, a handle or a phone number."
},
"disclaimer": {
"type": "string",
"maxLength": 120,
"title": "Small print",
"description": "A note that must be shown with the release, such as who gets it when."
},
"look": {
"type": "object",
"properties": {
"theme": {
"type": "string",
"enum": [
"brand",
"light",
"dark",
"bold"
],
"title": "Theme",
"description": "Brand: your brand's own colours and background. Light or dark: a page tinted with your brand colour. Bold: your brand colour as the page.",
"enumNames": [
"Brand colours",
"Light",
"Dark",
"Bold brand colour"
]
},
"pace": {
"type": "string",
"enum": [
"calm",
"standard",
"punchy"
],
"title": "Pace",
"description": "How things arrive: calm fades, a standard rhythm, or punchy slams and hard cuts.",
"enumNames": [
"Calm",
"Standard",
"Punchy"
]
},
"corners": {
"type": "string",
"enum": [
"square",
"soft",
"round"
],
"title": "Corners",
"description": "The shape of cards, pictures and buttons.",
"enumNames": [
"Square",
"Softly rounded",
"Round"
]
},
"align": {
"type": "string",
"enum": [
"start",
"centre"
],
"title": "Text alignment",
"description": "Where the text lines up.",
"enumNames": [
"At the start of the line",
"Centred"
]
},
"layout": {
"type": "string",
"enum": [
"log",
"cards"
],
"title": "Layout",
"description": "Log: the changes build up as a list along a line. Cards: one change at a time, large, on a deck of cards.",
"enumNames": [
"A growing log",
"One card at a time"
]
},
"groupByKind": {
"type": "boolean",
"title": "Group by kind",
"description": "Show the new changes first, then the improved, fixed and removed ones, rather than in the order sent."
},
"logo": {
"type": "string",
"enum": [
"auto",
"free"
],
"title": "Logo",
"description": "The style's own: the logo on the style's plate (a card, a disc, a badge) so it reads on any page. As it is: the logo whole, with no plate, frame or crop, for a logo made to stand on the page, such as one with a transparent background. As it is, make sure your logo reads on the page of the theme you choose.",
"enumNames": [
"The style's own",
"As it is, no plate or crop"
]
}
},
"additionalProperties": false,
"title": "Look",
"description": "How the clip looks and moves. The same five switches in every format (theme, pace, corners, alignment, logo), plus this format's own. Leave any out for the format's default."
}
},
"required": [
"version",
"changes"
],
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the version and its date, the changes, the words for each kind of change and the call to action."
},
"metaData": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 100,
"title": "Title",
"description": "Used where the platform has a title of its own: Facebook Feed, LinkedIn, Pinterest and YouTube. Up to 100 characters, which every one of them takes."
},
"captionTiny": {
"type": "string",
"maxLength": 200,
"title": "Tiny description (Pinterest, Threads, X)",
"description": "Up to 200 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionShort": {
"type": "string",
"maxLength": 500,
"title": "Short description (Telegram, Threema, WeChat, WhatsApp)",
"description": "Up to 500 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionMedium": {
"type": "string",
"maxLength": 1500,
"title": "Medium description (Discord, Facebook Reels, Instagram, LinkedIn, Signal, Slack, TikTok)",
"description": "Up to 1500 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionLong": {
"type": "string",
"maxLength": 4000,
"title": "Long description (Facebook Feed, YouTube)",
"description": "Up to 4000 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"hashtags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60,
"title": "Hashtag"
},
"maxItems": 15,
"title": "Hashtags",
"description": "Written without the #. Up to 15, which every platform takes."
}
},
"additionalProperties": false,
"title": "Meta data",
"description": "Everything about the post that is never drawn in the clip: its title, its description in four lengths, one per kind of platform, and its hashtags. Reelwire adds the brand's description, link and hashtags after it. Left out, the post text is generated from the clip data."
},
"locales": {
"type": "object",
"additionalProperties": {
"type": "object",
"properties": {
"clipData": {
"type": "object",
"properties": {
"kicker": {
"type": "string",
"maxLength": 32,
"title": "Product",
"description": "A short line above the version, usually the product's or the app's name."
},
"version": {
"type": "string",
"maxLength": 16,
"title": "Version",
"description": "The version as it should be read, such as v4.2.0, 2026.10 or Release 12."
},
"headline": {
"type": "string",
"maxLength": 64,
"title": "Headline",
"description": "What this release is about, in a line."
},
"date": {
"type": "string",
"maxLength": 40,
"title": "Date",
"description": "When it was released or reaches everybody, as it should be read."
},
"changes": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"new",
"improved",
"fixed",
"removed"
],
"title": "Kind",
"description": "What sort of change it is. Each kind has its own icon and colour; its word is set under Words for the kinds.",
"enumNames": [
"New",
"Improved",
"Fixed",
"Removed"
]
},
"text": {
"type": "string",
"maxLength": 72,
"title": "Change",
"description": "The change, in a short sentence."
},
"detail": {
"type": "string",
"maxLength": 72,
"title": "Detail",
"description": "One more line about it, such as who gets it or where to find it."
}
},
"required": [
"text"
],
"additionalProperties": false,
"title": "Change"
},
"minItems": 1,
"maxItems": 8,
"title": "Changes",
"description": "One to eight changes, shown one after another; the clip gets a little under two seconds longer for each."
},
"labels": {
"type": "object",
"properties": {
"new": {
"type": "string",
"maxLength": 16,
"title": "New",
"description": "The word for a change marked new."
},
"improved": {
"type": "string",
"maxLength": 16,
"title": "Improved",
"description": "The word for a change marked improved."
},
"fixed": {
"type": "string",
"maxLength": 16,
"title": "Fixed",
"description": "The word for a change marked fixed."
},
"removed": {
"type": "string",
"maxLength": 16,
"title": "Removed",
"description": "The word for a change marked removed."
}
},
"additionalProperties": false,
"title": "Words for the kinds",
"description": "The word shown with each kind of change, in the clip's language. Leave one out and that kind shows its icon alone."
},
"picture": {
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"pattern": "^media:\\/\\/[^\\s/\\\\\\u0000-\\u001f][^/\\\\\\u0000-\\u001f]{0,254}$",
"title": "Picture",
"description": "A file from the workspace's media library, written media:// and the file's id or name. A web address is refused."
},
"alt": {
"type": "string",
"maxLength": 120,
"title": "Alt text",
"description": "What the picture shows, for anyone who cannot see it."
}
},
"required": [
"url"
],
"additionalProperties": false,
"title": "Picture",
"description": "A screenshot of the release or the product, shown with the version at the start; any shape works."
},
"cta": {
"type": "object",
"properties": {
"label": {
"type": "string",
"maxLength": 28,
"title": "Button",
"description": "What the button says."
},
"detail": {
"type": "string",
"maxLength": 48,
"title": "Line under it",
"description": "An address, a handle, a phone number."
}
},
"additionalProperties": false,
"title": "Call to action",
"description": "The button at the end and the line under it, such as a web address, a handle or a phone number."
},
"disclaimer": {
"type": "string",
"maxLength": 120,
"title": "Small print",
"description": "A note that must be shown with the release, such as who gets it when."
},
"look": {
"type": "object",
"properties": {
"theme": {
"type": "string",
"enum": [
"brand",
"light",
"dark",
"bold"
],
"title": "Theme",
"description": "Brand: your brand's own colours and background. Light or dark: a page tinted with your brand colour. Bold: your brand colour as the page.",
"enumNames": [
"Brand colours",
"Light",
"Dark",
"Bold brand colour"
]
},
"pace": {
"type": "string",
"enum": [
"calm",
"standard",
"punchy"
],
"title": "Pace",
"description": "How things arrive: calm fades, a standard rhythm, or punchy slams and hard cuts.",
"enumNames": [
"Calm",
"Standard",
"Punchy"
]
},
"corners": {
"type": "string",
"enum": [
"square",
"soft",
"round"
],
"title": "Corners",
"description": "The shape of cards, pictures and buttons.",
"enumNames": [
"Square",
"Softly rounded",
"Round"
]
},
"align": {
"type": "string",
"enum": [
"start",
"centre"
],
"title": "Text alignment",
"description": "Where the text lines up.",
"enumNames": [
"At the start of the line",
"Centred"
]
},
"layout": {
"type": "string",
"enum": [
"log",
"cards"
],
"title": "Layout",
"description": "Log: the changes build up as a list along a line. Cards: one change at a time, large, on a deck of cards.",
"enumNames": [
"A growing log",
"One card at a time"
]
},
"groupByKind": {
"type": "boolean",
"title": "Group by kind",
"description": "Show the new changes first, then the improved, fixed and removed ones, rather than in the order sent."
},
"logo": {
"type": "string",
"enum": [
"auto",
"free"
],
"title": "Logo",
"description": "The style's own: the logo on the style's plate (a card, a disc, a badge) so it reads on any page. As it is: the logo whole, with no plate, frame or crop, for a logo made to stand on the page, such as one with a transparent background. As it is, make sure your logo reads on the page of the theme you choose.",
"enumNames": [
"The style's own",
"As it is, no plate or crop"
]
}
},
"additionalProperties": false,
"title": "Look",
"description": "How the clip looks and moves. The same five switches in every format (theme, pace, corners, alignment, logo), plus this format's own. Leave any out for the format's default."
}
},
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn in the clip: the version and its date, the changes, the words for each kind of change and the call to action."
},
"metaData": {
"type": "object",
"properties": {
"title": {
"type": "string",
"maxLength": 100,
"title": "Title",
"description": "Used where the platform has a title of its own: Facebook Feed, LinkedIn, Pinterest and YouTube. Up to 100 characters, which every one of them takes."
},
"captionTiny": {
"type": "string",
"maxLength": 200,
"title": "Tiny description (Pinterest, Threads, X)",
"description": "Up to 200 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionShort": {
"type": "string",
"maxLength": 500,
"title": "Short description (Telegram, Threema, WeChat, WhatsApp)",
"description": "Up to 500 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionMedium": {
"type": "string",
"maxLength": 1500,
"title": "Medium description (Discord, Facebook Reels, Instagram, LinkedIn, Signal, Slack, TikTok)",
"description": "Up to 1500 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"captionLong": {
"type": "string",
"maxLength": 4000,
"title": "Long description (Facebook Feed, YouTube)",
"description": "Up to 4000 characters. The brand's description, link and hashtags follow it within the platform's limit."
},
"hashtags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60,
"title": "Hashtag"
},
"maxItems": 15,
"title": "Hashtags",
"description": "Written without the #. Up to 15, which every platform takes."
}
},
"additionalProperties": false,
"title": "Meta data",
"description": "Everything about the post that is never drawn in the clip: its title, its description in four lengths, one per kind of platform, and its hashtags. Reelwire adds the brand's description, link and hashtags after it. Left out, the post text is generated from the clip data."
}
},
"additionalProperties": false
},
"propertyNames": {
"enum": [
"aa",
"ab",
"ae",
"af",
"ak",
"am",
"an",
"ar",
"as",
"av",
"ay",
"az",
"ba",
"be",
"bg",
"bi",
"bm",
"bn",
"bo",
"br",
"bs",
"ca",
"ce",
"ch",
"co",
"cr",
"cs",
"cu",
"cv",
"cy",
"da",
"de",
"dv",
"dz",
"ee",
"el",
"en",
"eo",
"es",
"et",
"eu",
"fa",
"ff",
"fi",
"fj",
"fo",
"fr",
"fy",
"ga",
"gd",
"gl",
"gn",
"gu",
"gv",
"ha",
"he",
"hi",
"ho",
"hr",
"ht",
"hu",
"hy",
"hz",
"ia",
"id",
"ie",
"ig",
"ii",
"ik",
"io",
"is",
"it",
"iu",
"ja",
"jv",
"ka",
"kg",
"ki",
"kj",
"kk",
"kl",
"km",
"kn",
"ko",
"kr",
"ks",
"ku",
"kv",
"kw",
"ky",
"la",
"lb",
"lg",
"li",
"ln",
"lo",
"lt",
"lu",
"lv",
"mg",
"mh",
"mi",
"mk",
"ml",
"mn",
"mr",
"ms",
"mt",
"my",
"na",
"nb",
"nd",
"ne",
"ng",
"nl",
"nn",
"no",
"nr",
"nv",
"ny",
"oc",
"oj",
"om",
"or",
"os",
"pa",
"pi",
"pl",
"ps",
"pt",
"qu",
"rm",
"rn",
"ro",
"ru",
"rw",
"sa",
"sc",
"sd",
"se",
"sg",
"si",
"sk",
"sl",
"sm",
"sn",
"so",
"sq",
"sr",
"ss",
"st",
"su",
"sv",
"sw",
"ta",
"te",
"tg",
"th",
"ti",
"tk",
"tl",
"tn",
"to",
"tr",
"ts",
"tt",
"tw",
"ty",
"ug",
"uk",
"ur",
"uz",
"ve",
"vi",
"vo",
"wa",
"wo",
"xh",
"yi",
"yo",
"za",
"zh",
"zu",
"zh-CN",
"zh-TW",
"pt-BR"
]
}
}
},
"required": [
"clipData"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
Ask Reelwire for the same document yourself, without signing in:
curl "http://localhost:4000/v1/formats/template/tpl_46549cf45b15?variant=Release%20notes&version=1.0.0"
Delivery JSON
Your own system sends this to one of your streams, POST /v1/stream, and every channel listening to
that stream draws it with its template. data is the document described above; a stream with an
empty field map passes it to the template unchanged. Try it first on POST /v1/stream/validate,
which answers the same without publishing anything. Streams and feeds
explains the rest, including how to map a document of your own shape instead.
{
"streamId": "st_your_stream_id",
"eventId": "01M2SQMKK3G1NVFXV31DCBVB95",
"occurredAt": "2026-09-23T07:00:00Z",
"locale": "en",
"data": {
"clipData": {
"kicker": "Lumen Studio",
"version": "v4.2.0",
"headline": "Offline drafts, faster sync and one search for everything",
"date": "Rolling out from 1 October 2026",
"changes": [
{
"kind": "new",
"text": "Offline drafts: keep writing without a connection",
"detail": "Everything syncs the moment you are back online"
},
{
"kind": "new",
"text": "One search box for every workspace you belong to",
"detail": "Press Ctrl K anywhere to open it"
},
{
"kind": "improved",
"text": "Sync is up to three times faster on large projects",
"detail": "Measured on projects of 20,000 files and more"
},
{
"kind": "improved",
"text": "Dark mode with calmer contrast and sharper charts"
},
{
"kind": "fixed",
"text": "Comments stay in place when a file is renamed"
},
{
"kind": "fixed",
"text": "Exports keep their time zone on every device"
},
{
"kind": "removed",
"text": "The legacy v1 API, retired as announced in May",
"detail": "Every call now goes to v2"
}
],
"labels": {
"new": "New",
"improved": "Improved",
"fixed": "Fixed",
"removed": "Removed"
},
"picture": {
"alt": "Soft waves of blue, violet and orange",
"url": "media://example-image.jpg"
},
"cta": {
"label": "Update now",
"detail": "lumenlabs.example/changelog"
},
"disclaimer": "Rolling out to all plans over the next two weeks. Offline drafts need the desktop app.",
"look": {
"theme": "brand",
"pace": "standard",
"corners": "soft",
"align": "start",
"layout": "log",
"groupByKind": false,
"logo": "auto"
}
},
"metaData": {
"title": "Lumen Studio 4.2 is here",
"captionTiny": "Lumen Studio 4.2: offline drafts, faster sync and one search for every workspace.",
"captionShort": "Lumen Studio 4.2 is rolling out: write offline and sync when you are back, search every workspace from one box, and sync up to three times faster on large projects. Plus a calmer dark mode and two fixes.",
"captionMedium": "Lumen Studio 4.2 is rolling out from 1 October. Offline drafts let you keep writing without a connection and sync the moment you are back online. One search box now covers every workspace you belong to. Sync is up to three times faster on large projects, dark mode has calmer contrast and sharper charts, comments stay in place when a file is renamed and exports keep their time zone. The legacy v1 API is retired as announced in May. Update from the app or read the full changelog on our website.",
"captionLong": "Lumen Studio 4.2 is rolling out from 1 October 2026, to every plan over the next two weeks. Offline drafts let you keep writing without a connection, and everything syncs the moment you are back online (offline drafts need the desktop app). One search box now covers every workspace you belong to: press Ctrl K anywhere to open it. Sync is up to three times faster on projects of 20,000 files and more, and dark mode has calmer contrast and sharper charts. We fixed comments jumping when a file was renamed and exports losing their time zone on some devices. The legacy v1 API is retired as announced in May, and every call now goes to v2. Update from the app, or read the full changelog on our website.",
"hashtags": [
"releasenotes",
"changelog",
"lumenstudio",
"productupdate"
]
}
}
}
The delivery names no version: which build draws it is the channel's choice, the newest of its
variant or the one it is pinned to. eventId is a ULID you make once per event: sending the same
one again changes nothing. occurredAt is when the thing happened, not when you sent it. locale
is the language of the text in data, and data.locales carries other languages beside it.