Render context
The data context templates render with. Templates receive ONLY platform-provided data, never secrets, never other tenants’ data. Additive-only within a contract major. Section renderers get {section, brand}; the layout gets {brand, nav, socials}; page templates (pages/{page}.liquid) get their page’s documented objects + brand.
In section renderers
Section titled “In section renderers”| Variable | Description |
|---|---|
site |
The one content tree (content model v1, contract/v1/content-model.json): site.brand, site.nav, site.socials, site.locale and the typed collections under site.content.*. Available to every render scope; page templates receive it alongside their page objects. |
site.brand |
The organisation’s branding (same shape as the flat-era brand object). |
site.nav |
Navigation: items (curated main or platform-derived), footer, derived, the flat-era nav shape, re-addressed. |
site.focus |
What the primary_action_widget island becomes: ‘donate’ (default, the donation widget), ‘volunteer’ (the volunteer sign-up) or ‘none’ (the charity chose no widget in the hero). The charity’s one switch (docs/volunteering.md ‘Site focus’); everything below follows from it. |
site.actions |
The two resolved actions: primary { kind, label, href } is the focus (the widget in the hero); secondary is the other action (the header button). Both always exist. |
section.primary |
homeHero only: the leading action { kind, label, href }, the same as site.actions.primary. Render it as a widget with {% island ‘primary_action_widget’ %} when section.actionStyle is ‘widget’; that island becomes this action’s widget. |
section.secondary |
homeHero only: the other action { kind, label, href }, the same as site.actions.secondary; the header button carries it. |
section.action |
homeHero only: the hero’s own button { kind, label, href }: the action whose widget is NOT on the page (donation widget present, the button is Volunteer; volunteer widget present, the button is Donate), or the leading action when actionStyle is ‘button’. Render it as the first hero button unless the author set primaryLabel / primaryHref; the second button stays the author’s story link. |
section.actionStyle |
homeHero only: ‘widget’ (the leading action’s widget sits in the hero) or ‘button’ (copy only, the primary button is the way in). The old givingStyle value is kept as an alias (‘form’ = ‘widget’). |
site.socials |
Social links, the flat-era socials shape. |
site.locale |
Locale: code, direction, languages. |
site.content |
The typed collections: services, events, articles, campaigns, causes, courses, resources, locations, schedules, about. EVERY collection is bounded (cap + moreHref in the model registry), every enum is open, every optional field explicitly nullable, and the model only ever grows. The validator computes your template’s content footprint from the paths you read and stamps the required minimum model version at publish; dynamic indexing into site.content is refused so the footprint stays decidable. |
In the layout
Section titled “In the layout”| Variable | Description |
|---|---|
site |
The one content tree (content model v1, contract/v1/content-model.json): site.brand, site.nav, site.socials, site.locale and the typed collections under site.content.*. Available to every render scope; page templates receive it alongside their page objects. |
site.brand |
The organisation’s branding (same shape as the flat-era brand object). |
site.nav |
Navigation: items (curated main or platform-derived), footer, derived, the flat-era nav shape, re-addressed. |
site.focus |
What the primary_action_widget island becomes: ‘donate’ (default, the donation widget), ‘volunteer’ (the volunteer sign-up) or ‘none’ (the charity chose no widget in the hero). The charity’s one switch (docs/volunteering.md ‘Site focus’); everything below follows from it. |
site.actions |
The two resolved actions: primary { kind, label, href } is the focus (the widget in the hero); secondary is the other action (the header button). Both always exist. |
site.socials |
Social links, the flat-era socials shape. |
site.locale |
Locale: code, direction, languages. |
site.content |
The typed collections: services, events, articles, campaigns, causes, courses, resources, locations, schedules, about. EVERY collection is bounded (cap + moreHref in the model registry), every enum is open, every optional field explicitly nullable, and the model only ever grows. The validator computes your template’s content footprint from the paths you read and stamps the required minimum model version at publish; dynamic indexing into site.content is refused so the footprint stays decidable. |
In pages/events.liquid
Section titled “In pages/events.liquid”| Variable | Description |
|---|
In the events section renderer (sections/events.liquid)
Section titled “In the events section renderer (sections/events.liquid)”| Variable | Description |
|---|
In the appealGrid section renderer (sections/appealGrid.liquid)
Section titled “In the appealGrid section renderer (sections/appealGrid.liquid)”| Variable | Description |
|---|
In the emergency section renderer (sections/emergency.liquid)
Section titled “In the emergency section renderer (sections/emergency.liquid)”| Variable | Description |
|---|
In the programmes section renderer (sections/programmes.liquid)
Section titled “In the programmes section renderer (sections/programmes.liquid)”| Variable | Description |
|---|
In the resources section renderer (sections/resources.liquid)
Section titled “In the resources section renderer (sections/resources.liquid)”| Variable | Description |
|---|
In the locations section renderer (sections/locations.liquid)
Section titled “In the locations section renderer (sections/locations.liquid)”| Variable | Description |
|---|
In the whatsOn section renderer (sections/whatsOn.liquid)
Section titled “In the whatsOn section renderer (sections/whatsOn.liquid)”| Variable | Description |
|---|
In the articles section renderer (sections/articles.liquid)
Section titled “In the articles section renderer (sections/articles.liquid)”| Variable | Description |
|---|
In the campaigns section renderer (sections/campaigns.liquid)
Section titled “In the campaigns section renderer (sections/campaigns.liquid)”| Variable | Description |
|---|
In pages/articles.liquid
Section titled “In pages/articles.liquid”| Variable | Description |
|---|
In pages/article.liquid
Section titled “In pages/article.liquid”| Variable | Description |
|---|
In pages/course.liquid
Section titled “In pages/course.liquid”| Variable | Description |
|---|
<p class="lq-kicker">{{ section.eyebrow | default: brand.name }}</p>The validator’s fixtures
Section titled “The validator’s fixtures”The conformance validator renders your templates against these (they must survive them):
brand:
{ "name": "The Lantern Trust", "tagline": "Neighbours, looked after.", "logoUrl": null, "logoType": "full", "footerLogoUrl": null}nav (layout only):
{ "items": [ { "label": "Home", "href": "/", "cta": false }, { "label": "About us", "href": "/about", "cta": false }, { "label": "Events", "href": "/events", "cta": false }, { "label": "Services", "href": "/services", "cta": false, "children": [ { "label": "Food bank", "href": "/services?service=food-bank", "group": "Support", "description": "Emergency food parcels and practical advice." }, { "label": "Community", "href": "#", "group": "Get involved", "children": [ { "label": "Youth club", "href": "/services?service=youth-club" } ] } ], "megaMenu": { "columns": 3, "promo": { "title": "Visit this week", "text": "Find a programme and meet the team.", "href": "/services", "label": "Explore services" } } }, { "label": "Donate", "href": "/donate", "cta": true } ], "footer": [ { "label": "About us", "href": "/about" }, { "label": "Contact", "href": "https://example.org/contact", "external": true }, { "label": "Our work", "href": "#", "children": [ { "label": "Food bank", "href": "/services?service=food-bank" } ] } ], "derived": [ { "label": "Home", "href": "/", "cta": false }, { "label": "About us", "href": "/about", "cta": false }, { "label": "Events", "href": "/events", "cta": false }, { "label": "Donate", "href": "/donate", "cta": true } ]}worship (layout only, OPTIONAL, null when the tenant has no schedule; always branch):
{ "times": [ { "name": "Fajr", "begins": "03:20", "congregation": "04:00" }, { "name": "Zuhr", "begins": "13:11", "congregation": "13:30" }, { "name": "Asr", "begins": "18:30", "congregation": "19:00" }, { "name": "Maghrib", "begins": "21:04", "congregation": "21:04" }, { "name": "Isha", "begins": "22:12", "congregation": "22:30" } ], "beginsLabel": "Begins", "congregationLabel": "Jama'at", "note": "Jum'a 13:15 & 14:15", "href": "/services?service=prayer-times", "today": "24 July 2026", "todayAlt": "11 Safar 1448", "next": { "name": "Asr", "begins": "18:30", "congregation": "19:00", "target": "2030-07-24T19:00:00+01:00" }, "jumah": [ { "name": "Jum'a 1", "begins": null, "congregation": "13:15" }, { "name": "Jum'a 2", "begins": null, "congregation": "14:15" } ], "hijri": { "display": "11 Safar 1448" }, "observances": [ { "name": "Community iftar", "date": "2 March 2030", "href": "/events" } ]}pages/events.liquid:
{ "events": [ { "id": "22222222-2222-2222-2222-222222222222", "name": "The Lantern Gala", "description": "Our biggest night of the year: supper, music from the Alderford Community Choir, and the annual lantern walk along the river to close.", "registrationMode": "TICKETED", "startsAt": "2030-09-20T19:00:00Z", "endsAt": null, "venueName": "The Maltings, Alderford", "online": false, "imageUrl": "p60fixture:event/gala", "onSale": true, "soldOut": false, "priceFrom": 25, "currency": "GBP", "detailHref": "/events?event=22222222-2222-2222-2222-222222222222" }, { "id": "44444444-4444-4444-4444-444444444444", "name": "Riverside Harvest Supper", "description": "A long-table supper on the Aldern meadow, cooked by our kitchen volunteers with produce from the community garden.", "registrationMode": "TICKETED", "startsAt": "2030-10-04T18:30:00Z", "endsAt": "2030-10-04T22:00:00Z", "venueName": "Aldern Meadow", "online": false, "imageUrl": "p60fixture:event/harvest", "onSale": true, "soldOut": false, "priceFrom": 12.5, "currency": "GBP", "detailHref": "/events?event=44444444-4444-4444-4444-444444444444" }, { "id": "55555555-5555-5555-5555-555555555555", "name": "Volunteer Welcome Evening", "description": "Meet the team, hear where help is needed most this season, and find a role that fits the time you have.", "registrationMode": "RSVP", "startsAt": "2030-09-03T18:00:00Z", "endsAt": "2030-09-03T19:30:00Z", "venueName": "Foundry Lane Hub", "online": false, "imageUrl": "p60fixture:event/welcome", "onSale": true, "soldOut": false, "priceFrom": null, "currency": null, "detailHref": "/events?event=55555555-5555-5555-5555-555555555555" }, { "id": "66666666-6666-6666-6666-666666666666", "name": "Warm Space Wednesdays", "description": "Our hall is open, warm and stocked with tea every Wednesday through the cold months. No booking, no questions, everyone welcome.", "registrationMode": "INFO", "startsAt": "2030-11-06T10:00:00Z", "endsAt": "2030-11-06T15:00:00Z", "venueName": "St Chad's Hall", "online": false, "imageUrl": null, "onSale": true, "soldOut": false, "priceFrom": null, "currency": null, "detailHref": "/events?event=66666666-6666-6666-6666-666666666666" }, { "id": "77777777-7777-7777-7777-777777777777", "name": "Money Advice Drop-in", "description": "A quiet hour with our trained advisers. Bring letters you are worried about; we will work through them together.", "registrationMode": "INFO", "startsAt": "2030-09-12T10:00:00Z", "endsAt": "2030-09-12T12:00:00Z", "venueName": null, "online": true, "imageUrl": null, "onSale": true, "soldOut": false, "priceFrom": null, "currency": null, "detailHref": "/events?event=77777777-7777-7777-7777-777777777777" }, { "id": "88888888-8888-8888-8888-888888888888", "name": "Winter Fair", "description": "Stalls, carols and the grand raffle in aid of the Winter Appeal. Free entry; every stall staffed by volunteers.", "registrationMode": "TICKETED", "startsAt": "2030-12-07T11:00:00Z", "endsAt": "2030-12-07T16:00:00Z", "venueName": "Alderford Market Square", "online": false, "imageUrl": "p60fixture:event/winterfair", "onSale": true, "soldOut": true, "priceFrom": 0, "currency": "GBP", "detailHref": "/events?event=88888888-8888-8888-8888-888888888888" } ]}pages/course.liquid:
{ "course": { "id": "33333333-3333-3333-3333-333333333333", "title": "Junior Athletics", "description": "Weekly athletics for children aged 7 to 12, coached by qualified volunteers at the King's Park track.", "aboutHtml": "<h2>What we do</h2><p>Track and field fundamentals in a friendly, coached setting: warm-ups, drills, and a different discipline every week.</p><ul><li>Sprints, relays and middle distance</li><li>Long jump, high jump and throws</li><li>A club mini-meet at the end of every term</li></ul><h2>What to bring</h2><p>Trainers, a water bottle and a waterproof. Everything else, including spikes for the older group, is provided.</p>", "imageUrl": "p60fixture:course/athletics", "venue": "King's Park track", "audience": "CHILD", "billingMode": "ROLLING", "termStart": null, "termEnd": null, "currency": "GBP", "priceFrom": 15, "soldOut": false, "backHref": "/courses" }}pages/articles.liquid:
{ "selectedCategory": null, "categories": [ { "name": "News", "count": 3, "href": "/articles/all?category=News" }, { "name": "Stories", "count": 2, "href": "/articles/all?category=Stories" }, { "name": "Guides", "count": 1, "href": "/articles/all?category=Guides" } ], "articles": [ { "id": "88888888-8888-8888-8888-888888888888", "title": "The Community Garden Opens Its Gates", "slug": "community-garden-opens", "excerpt": "Two years of digging, fundraising and Saturday mornings in the rain: the Foundry Lane garden is finally open to everyone.", "imageUrl": "p60fixture:article/garden", "authorName": "Amina Khan", "authorRole": "Community Editor", "categories": [ "News" ], "publishedAt": "2030-04-12T09:00:00Z", "readingMinutes": 5, "viewCount": 412, "likeCount": 38, "commentCount": 9, "href": "/articles/community-garden-opens" }, { "id": "99999999-9999-9999-9999-999999999999", "title": "What a Food Parcel Actually Holds", "slug": "what-a-food-parcel-holds", "excerpt": "People imagine tins and pasta. The real list is longer, more personal, and put together with more care than you might think.", "imageUrl": "p60fixture:article/parcel", "authorName": "Derek Osei", "authorRole": "Food Bank Lead", "categories": [ "Stories" ], "publishedAt": "2030-03-28T09:00:00Z", "readingMinutes": 6, "viewCount": 655, "likeCount": 61, "commentCount": 14, "href": "/articles/what-a-food-parcel-holds" }, { "id": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "title": "Meet the Wednesday Kitchen Crew", "slug": "wednesday-kitchen-crew", "excerpt": "Eleven volunteers, one borrowed oven, and a hundred and forty hot meals a week. The kitchen crew tell it in their own words.", "imageUrl": "p60fixture:people/kitchen", "authorName": "Amina Khan", "authorRole": "Community Editor", "categories": [ "Stories" ], "publishedAt": "2030-03-02T09:00:00Z", "readingMinutes": 7, "viewCount": 388, "likeCount": 45, "commentCount": 11, "href": "/articles/wednesday-kitchen-crew" }, { "id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", "title": "Winter Appeal: Where Your Money Went", "slug": "winter-appeal-report", "excerpt": "You gave 18,400 pounds in eight weeks. Here is the line-by-line account of what it paid for, and what we learned.", "imageUrl": "p60fixture:campaign/winterreport", "authorName": "Priya Sharma", "authorRole": "Trustee", "categories": [ "News" ], "publishedAt": "2030-02-14T09:00:00Z", "readingMinutes": 8, "viewCount": 902, "likeCount": 84, "commentCount": 21, "href": "/articles/winter-appeal-report" }, { "id": "cccccccc-cccc-cccc-cccc-cccccccccccc", "title": "Five Things Our Money Advisers Wish You Knew", "slug": "money-advice-five-things", "excerpt": "The advice team see the same worries again and again. Most of them have a fix that takes less than an hour.", "imageUrl": null, "authorName": "Tom Bradley", "authorRole": "Advice Service", "categories": [ "Guides" ], "publishedAt": "2030-01-30T09:00:00Z", "readingMinutes": 4, "viewCount": 1204, "likeCount": 96, "commentCount": 17, "href": "/articles/money-advice-five-things" }, { "id": "dddddddd-dddd-dddd-dddd-dddddddddddd", "title": "A Year of Warm Spaces, in Numbers", "slug": "warm-spaces-in-numbers", "excerpt": "Fourteen hundred visits, ninety regulars, and one chess league nobody planned. What happens when you just open the door.", "imageUrl": "p60fixture:service/warmspace", "authorName": "Amina Khan", "authorRole": "Community Editor", "categories": [ "News" ], "publishedAt": "2030-01-08T09:00:00Z", "readingMinutes": 5, "viewCount": 517, "likeCount": 42, "commentCount": 8, "href": "/articles/warm-spaces-in-numbers" } ]}pages/article.liquid:
{ "article": { "id": "88888888-8888-8888-8888-888888888888", "title": "The Community Garden Opens Its Gates", "slug": "community-garden-opens", "excerpt": "Two years of digging, fundraising and Saturday mornings in the rain: the Foundry Lane garden is finally open to everyone.", "imageUrl": "p60fixture:article/garden", "authorName": "Amina Khan", "authorRole": "Community Editor", "categories": [ "News" ], "publishedAt": "2030-04-12T09:00:00Z", "readingMinutes": 5, "viewCount": 412, "likeCount": 38, "commentCount": 9, "href": "/articles/community-garden-opens", "updatedAt": "2030-04-12T10:00:00Z", "bodyHtml": "<h2>A shared place to grow</h2><p>The gates opened at ten. By half past, every raised bed had a family around it, the tool shed had a queue, and somebody had already claimed the sunny corner by the wall for tomatoes.</p><p>The Foundry Lane garden has been two years in the making. It began as a patch of rubble behind the old ironworks, offered to us on a peppercorn lease after the Winter Fair of 2028, and it has been built almost entirely by volunteer weekends since: twenty-two raised beds, a wheelchair-accessible path, a rainwater store, and a greenhouse pieced together from three donated ones.</p><blockquote><p>I have lived on this street forty years and never once stood on this ground. Now my grandchildren grow beans here.</p></blockquote><h2>What happens next</h2><p>The beds are allocated, but the garden is not finished, and it is not meant to be. This season the growers' committee has three priorities:</p><ul><li>A covered seating area, so the garden works in the rain it will certainly get</li><li>Weekly sessions with the youth club, growing the salads the kitchen crew cook with</li><li>A seed library in the old gatehouse, free to any Alderford household</li></ul><p>If you can lay a slab, mend a frame or simply keep a kettle going, the volunteer team would love to hear from you. And if you just want somewhere green to sit, the gate is open every day until dusk.</p><h3>Thank you</h3><p>To the eighty-one people who gave to the garden appeal, the six local firms who lent tools and time, and the council officers who said yes when it mattered: this one is yours as much as ours.</p>", "allowComments": true }, "relatedArticles": [ { "id": "99999999-9999-9999-9999-999999999999", "title": "What a Food Parcel Actually Holds", "slug": "what-a-food-parcel-holds", "excerpt": "People imagine tins and pasta. The real list is longer, more personal, and put together with more care than you might think.", "imageUrl": "p60fixture:article/parcel", "authorName": "Derek Osei", "authorRole": "Food Bank Lead", "categories": [ "Stories" ], "publishedAt": "2030-03-28T09:00:00Z", "readingMinutes": 6, "viewCount": 655, "likeCount": 61, "commentCount": 14, "href": "/articles/what-a-food-parcel-holds" }, { "id": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", "title": "Winter Appeal: Where Your Money Went", "slug": "winter-appeal-report", "excerpt": "You gave 18,400 pounds in eight weeks. Here is the line-by-line account of what it paid for, and what we learned.", "imageUrl": "p60fixture:campaign/winterreport", "authorName": "Priya Sharma", "authorRole": "Trustee", "categories": [ "News" ], "publishedAt": "2030-02-14T09:00:00Z", "readingMinutes": 8, "viewCount": 902, "likeCount": 84, "commentCount": 21, "href": "/articles/winter-appeal-report" }, { "id": "dddddddd-dddd-dddd-dddd-dddddddddddd", "title": "A Year of Warm Spaces, in Numbers", "slug": "warm-spaces-in-numbers", "excerpt": "Fourteen hundred visits, ninety regulars, and one chess league nobody planned. What happens when you just open the door.", "imageUrl": "p60fixture:service/warmspace", "authorName": "Amina Khan", "authorRole": "Community Editor", "categories": [ "News" ], "publishedAt": "2030-01-08T09:00:00Z", "readingMinutes": 5, "viewCount": 517, "likeCount": 42, "commentCount": 8, "href": "/articles/warm-spaces-in-numbers" } ], "backHref": "/articles"}
