Skip to main content

Timeline, Bento grid 1.0.0

TemplateTimeline, tpl_f9a5586f07eb
VariantBento grid
Version1.0.0, the newest: what a channel following this variant draws
Shapes9x16, 4x5, 1x1, 16x9, 2x3
Length24 seconds

Example video​

The 1x1 cut of this version, drawn from its own worked example. Open the video on its own.

What it accepts​

A line of years with up to five eras laid on it and two to eight milestones: a marker travels the line from milestone to milestone, each popping up with its year, title, line and a picture where one is sent, and the clip ends on every milestone listed under the line. metaData is the post's title, descriptions and hashtags and is never drawn.

FieldTypeRequiredLimitWhat it is
clipDatagroupyesClip data: Everything drawn: a kicker, the title, the span of years, the eras, two to eight milestones with their pictures, the source and the look.
clipData.kickertextup to 20 charactersKicker: A word above the title, such as OUR STORY or 50 YEARS.
clipData.titletextyesup to 80 charactersTitle: What the timeline tells. Shown above the line the whole time.
clipData.fromintegeryesFirst year: Where the line of years starts. A milestone outside the span widens it.
clipData.tointegeryesLast year: Where the line of years ends. At the end of the clip the marker runs on to it.
clipData.eraslistup to 5Eras: Up to five periods laid on the line as bands, each with its name over it. The era the marker is in is lit, and each milestone's card names its era.
clipData.eras[]groupEra
clipData.eras[].nametextyesup to 24 charactersName
clipData.eras[].fromintegeryesFrom: The year the era starts.
clipData.eras[].tointegeryesTo: The year the era ends.
clipData.milestoneslistyesat least 2, up to 8Milestones: Two to eight moments, each shown in turn as the marker reaches it, with its year, a title, a line and a picture where one is sent, then all of them listed at the end. They are put in the order of their years for you. Each adds a little over three seconds, so eight run about 31 seconds.
clipData.milestones[]groupMilestone
clipData.milestones[].yearintegeryesYear
clipData.milestones[].titletextyesup to 40 charactersTitle: What happened, in a few words.
clipData.milestones[].linetextup to 100 charactersLine: One or two sentences on what happened.
clipData.milestones[].pictureimagemedia:// file from the media library, alt text up to 120 charactersPicture: A picture from the media library, shown with the milestone and filling its frame. A milestone without one shows its words larger.
clipData.sourcetextup to 60 charactersSource: Where the dates come from, shown small at the foot.
clipData.lookgroupLook: How the clip looks and moves within its style. The same five switches in every format of the collections. Leave a switch out, or set it to the style's own, and the style decides.
clipData.look.themeenumauto, brand, light, dark, boldTheme: The style's own choice; your brand's own colours and background; a light or dark page tinted with your brand colour; or your brand colour as the page.
clipData.look.paceenumauto, calm, standard, punchyPace: How things arrive: the style's own rhythm, calm fades, a standard rhythm, or punchy slams and cuts.
clipData.look.cornersenumauto, square, soft, roundCorners: The shape of cards, panels and marks.
clipData.look.alignenumauto, start, centreText alignment: Where the text lines up.
clipData.look.logoenumauto, freeLogo: 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.
metaDatagroupMeta 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.titletextup to 100 charactersTitle: 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.captionTinytextup to 200 charactersTiny description (Pinterest, Threads, X): Up to 200 characters. The brand's description, link and hashtags follow it within the platform's limit.
metaData.captionShorttextup to 500 charactersShort description (Telegram, Threema, WeChat, WhatsApp): Up to 500 characters. The brand's description, link and hashtags follow it within the platform's limit.
metaData.captionMediumtextup to 1500 charactersMedium 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.captionLongtextup to 4000 charactersLong description (Facebook Feed, YouTube): Up to 4000 characters. The brand's description, link and hashtags follow it within the platform's limit.
metaData.hashtagslistup to 15Hashtags: Written without the #. Up to 15, which every platform takes.
metaData.hashtags[]textup to 60 charactersHashtag

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 400 schema_validation error that names the field.

The JSON Schema
{
"type": "object",
"properties": {
"clipData": {
"type": "object",
"properties": {
"kicker": {
"type": "string",
"maxLength": 20,
"title": "Kicker",
"description": "A word above the title, such as OUR STORY or 50 YEARS."
},
"title": {
"type": "string",
"maxLength": 80,
"title": "Title",
"description": "What the timeline tells. Shown above the line the whole time."
},
"from": {
"type": "integer",
"title": "First year",
"description": "Where the line of years starts. A milestone outside the span widens it."
},
"to": {
"type": "integer",
"title": "Last year",
"description": "Where the line of years ends. At the end of the clip the marker runs on to it."
},
"eras": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 24,
"title": "Name"
},
"from": {
"type": "integer",
"title": "From",
"description": "The year the era starts."
},
"to": {
"type": "integer",
"title": "To",
"description": "The year the era ends."
}
},
"required": [
"name",
"from",
"to"
],
"additionalProperties": false,
"title": "Era"
},
"maxItems": 5,
"title": "Eras",
"description": "Up to five periods laid on the line as bands, each with its name over it. The era the marker is in is lit, and each milestone's card names its era."
},
"milestones": {
"type": "array",
"items": {
"type": "object",
"properties": {
"year": {
"type": "integer",
"title": "Year"
},
"title": {
"type": "string",
"maxLength": 40,
"title": "Title",
"description": "What happened, in a few words."
},
"line": {
"type": "string",
"maxLength": 100,
"title": "Line",
"description": "One or two sentences on what happened."
},
"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 picture from the media library, shown with the milestone and filling its frame. A milestone without one shows its words larger."
}
},
"required": [
"year",
"title"
],
"additionalProperties": false,
"title": "Milestone"
},
"minItems": 2,
"maxItems": 8,
"title": "Milestones",
"description": "Two to eight moments, each shown in turn as the marker reaches it, with its year, a title, a line and a picture where one is sent, then all of them listed at the end. They are put in the order of their years for you. Each adds a little over three seconds, so eight run about 31 seconds."
},
"source": {
"type": "string",
"maxLength": 60,
"title": "Source",
"description": "Where the dates come from, shown small at the foot."
},
"look": {
"type": "object",
"properties": {
"theme": {
"type": "string",
"enum": [
"auto",
"brand",
"light",
"dark",
"bold"
],
"title": "Theme",
"description": "The style's own choice; your brand's own colours and background; a light or dark page tinted with your brand colour; or your brand colour as the page.",
"enumNames": [
"The style's own",
"Brand colours",
"Light",
"Dark",
"Bold brand colour"
]
},
"pace": {
"type": "string",
"enum": [
"auto",
"calm",
"standard",
"punchy"
],
"title": "Pace",
"description": "How things arrive: the style's own rhythm, calm fades, a standard rhythm, or punchy slams and cuts.",
"enumNames": [
"The style's own",
"Calm",
"Standard",
"Punchy"
]
},
"corners": {
"type": "string",
"enum": [
"auto",
"square",
"soft",
"round"
],
"title": "Corners",
"description": "The shape of cards, panels and marks.",
"enumNames": [
"The style's own",
"Square",
"Softly rounded",
"Round"
]
},
"align": {
"type": "string",
"enum": [
"auto",
"start",
"centre"
],
"title": "Text alignment",
"description": "Where the text lines up.",
"enumNames": [
"The style's own",
"At the start of the line",
"Centred"
]
},
"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 within its style. The same five switches in every format of the collections. Leave a switch out, or set it to the style's own, and the style decides."
}
},
"required": [
"title",
"from",
"to",
"milestones"
],
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn: a kicker, the title, the span of years, the eras, two to eight milestones with their pictures, the source and the look."
},
"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": 20,
"title": "Kicker",
"description": "A word above the title, such as OUR STORY or 50 YEARS."
},
"title": {
"type": "string",
"maxLength": 80,
"title": "Title",
"description": "What the timeline tells. Shown above the line the whole time."
},
"from": {
"type": "integer",
"title": "First year",
"description": "Where the line of years starts. A milestone outside the span widens it."
},
"to": {
"type": "integer",
"title": "Last year",
"description": "Where the line of years ends. At the end of the clip the marker runs on to it."
},
"eras": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 24,
"title": "Name"
},
"from": {
"type": "integer",
"title": "From",
"description": "The year the era starts."
},
"to": {
"type": "integer",
"title": "To",
"description": "The year the era ends."
}
},
"required": [
"name",
"from",
"to"
],
"additionalProperties": false,
"title": "Era"
},
"maxItems": 5,
"title": "Eras",
"description": "Up to five periods laid on the line as bands, each with its name over it. The era the marker is in is lit, and each milestone's card names its era."
},
"milestones": {
"type": "array",
"items": {
"type": "object",
"properties": {
"year": {
"type": "integer",
"title": "Year"
},
"title": {
"type": "string",
"maxLength": 40,
"title": "Title",
"description": "What happened, in a few words."
},
"line": {
"type": "string",
"maxLength": 100,
"title": "Line",
"description": "One or two sentences on what happened."
},
"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 picture from the media library, shown with the milestone and filling its frame. A milestone without one shows its words larger."
}
},
"required": [
"year",
"title"
],
"additionalProperties": false,
"title": "Milestone"
},
"minItems": 2,
"maxItems": 8,
"title": "Milestones",
"description": "Two to eight moments, each shown in turn as the marker reaches it, with its year, a title, a line and a picture where one is sent, then all of them listed at the end. They are put in the order of their years for you. Each adds a little over three seconds, so eight run about 31 seconds."
},
"source": {
"type": "string",
"maxLength": 60,
"title": "Source",
"description": "Where the dates come from, shown small at the foot."
},
"look": {
"type": "object",
"properties": {
"theme": {
"type": "string",
"enum": [
"auto",
"brand",
"light",
"dark",
"bold"
],
"title": "Theme",
"description": "The style's own choice; your brand's own colours and background; a light or dark page tinted with your brand colour; or your brand colour as the page.",
"enumNames": [
"The style's own",
"Brand colours",
"Light",
"Dark",
"Bold brand colour"
]
},
"pace": {
"type": "string",
"enum": [
"auto",
"calm",
"standard",
"punchy"
],
"title": "Pace",
"description": "How things arrive: the style's own rhythm, calm fades, a standard rhythm, or punchy slams and cuts.",
"enumNames": [
"The style's own",
"Calm",
"Standard",
"Punchy"
]
},
"corners": {
"type": "string",
"enum": [
"auto",
"square",
"soft",
"round"
],
"title": "Corners",
"description": "The shape of cards, panels and marks.",
"enumNames": [
"The style's own",
"Square",
"Softly rounded",
"Round"
]
},
"align": {
"type": "string",
"enum": [
"auto",
"start",
"centre"
],
"title": "Text alignment",
"description": "Where the text lines up.",
"enumNames": [
"The style's own",
"At the start of the line",
"Centred"
]
},
"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 within its style. The same five switches in every format of the collections. Leave a switch out, or set it to the style's own, and the style decides."
}
},
"additionalProperties": false,
"title": "Clip data",
"description": "Everything drawn: a kicker, the title, the span of years, the eras, two to eight milestones with their pictures, the source and the look."
},
"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_f9a5586f07eb?variant=Bento%20grid&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": "50 years",
"title": "From a church hall to a city landmark: fifty years of the Millbrook Arts Centre",
"from": 1976,
"to": 2026,
"eras": [
{
"to": 1991,
"from": 1976,
"name": "The church hall"
},
{
"to": 2014,
"from": 1991,
"name": "The old mill"
},
{
"to": 2026,
"from": 2014,
"name": "Mill and quay"
}
],
"milestones": [
{
"line": "In a rented church hall they print with ink dropped into water, and 400 people see the first show.",
"year": 1976,
"title": "Twelve painters open a studio",
"picture": {
"alt": "Clouds of red and blue ink in water",
"url": "media://example-image.png"
}
},
{
"line": "The centre buys the empty mill by the river, with room for three galleries, a cafe and a print room.",
"year": 1991,
"title": "A home in the old grain mill"
},
{
"line": "Artists who paint on screens get a prize of their own, and the winning works light up the mill.",
"year": 2003,
"title": "The first digital art prize",
"picture": {
"alt": "Soft waves of blue, violet and orange",
"url": "media://example-image.jpg"
}
},
{
"line": "Every primary school in the city brings its classes for a day of painting, paid for by the centre.",
"year": 2009,
"title": "A free day for every school"
},
{
"line": "A new hall beside the mill doubles the space and shows the city's collection of landscapes.",
"year": 2014,
"title": "A glass gallery on the quay",
"picture": {
"alt": "Hills under an evening sky, drawn in layers",
"url": "media://example-image.svg"
}
},
{
"line": "For the anniversary every room is free all year, with a show of work from each of the fifty years.",
"year": 2026,
"title": "Fifty years, free for everyone"
}
],
"source": "Millbrook Arts Centre archive",
"look": {
"theme": "auto",
"pace": "auto",
"corners": "auto",
"align": "auto",
"logo": "auto"
}
},
"metaData": {
"title": "Fifty years of the Millbrook Arts Centre, from a church hall to the quay",
"captionTiny": "The Millbrook Arts Centre turns fifty. Six moments from its story, from twelve painters in a church hall in 1976 to a year of free entry for the anniversary.",
"captionShort": "The Millbrook Arts Centre turns fifty. It began in 1976, when twelve painters rented a church hall and printed with ink dropped into water. In 1991 it moved into the old grain mill by the river, in 2003 it gave the first prize for digital art, and since 2009 every primary school in the city has spent a free day there. A glass gallery on the quay opened in 2014, and this year every room is free.",
"captionMedium": "The Millbrook Arts Centre turns fifty this year, and its story fits on one line of years. It began in 1976, when twelve painters rented a church hall and printed with ink dropped into still water; four hundred people came to see the first show. In 1991 the centre bought the empty grain mill by the river, with room for three galleries, a cafe and a print room. In 2003 it gave its first prize for digital art, and the winning works were shown in the mill's windows. Since 2009 every primary school in the city has brought its classes for a free day of painting, paid for by the centre. In 2014 a glass gallery opened on the quay beside the mill, doubling the space and giving the city's collection of landscapes a home. For the anniversary every room is free all year, with a show of work from each of the fifty years. The names and dates in this clip are illustrative.",
"captionLong": "The Millbrook Arts Centre turns fifty this year, and its story fits on one line of years. It began in 1976, when twelve painters rented a church hall and printed with ink dropped into still water, a technique one of them had brought back from a summer course; four hundred people came to see the first show in its first week. For fifteen years the church hall was the centre: classes in the evenings, a show every season, and a print room in the vestry. In 1991 the centre bought the empty grain mill by the river, with room for three galleries, a cafe and a larger print room, and the number of visitors doubled within two years. In 2003 it gave its first prize for digital art, for artists who paint on screens, and the winning works were shown in the mill's windows every evening that winter. Since 2009 every primary school in the city has brought its classes for a free day of painting, paid for by the centre and its members. In 2014 a glass gallery opened on the quay beside the mill, doubling the space and giving the city's collection of landscapes a permanent home. For the anniversary every room is free all year, with a show of work from each of the fifty years, chosen by the people who made and saw it. The centre's archive of posters, catalogues and photographs is open on the first Saturday of every month. The names and dates in this clip are illustrative.",
"hashtags": [
"art",
"gallery",
"history",
"anniversary",
"culture"
]
}
}
}

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.