Template gallery / bulletin
Church bulletin template
Two-column weekly bulletin on one sheet, folded down the middle so the crease falls in the column gutter: an EB Garamond masthead, the order of service with hymn numbers aligned in a column of their own, who leads each item and an asterisk for standing, a reading printed in full where you want one, notices, the week ahead as a compact calendar with the times aligned, the prayer list, giving as a ruled account and who to ask. The columns flow, so adding a notice reflows the sheet rather than breaking it.
chromium default PDF 19 top-level fields Billed per page
Fields
The full JSON Schema is below. Required fields are marked; anything missing comes back as a 422 naming the path, the expected type and a value that would be accepted.
| Field | Type | Required | Description |
|---|---|---|---|
| accent | string | optional | The one plum spot: the strapline, the section marks, the standing asterisk and the prayer marks. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted. |
| organisation | object { name, strapline, address, phone, … } | required | |
| service | object { occasion, date, time, location } | required | |
| welcome | string | optional | The short note at the top of the first column, for whoever is here for the first time. |
| order_heading | string | optional | |
| order | array of object { title, detail, who, kind, … } | optional | The liturgy or run of the service, in order. |
| order_note | string | optional | |
| readings_heading | string | optional | |
| readings | array of object { reference, text, reader } | optional | Give `text` to print the passage in a quoted block, or just `reference` for a list. |
| announcements_heading | string | optional | |
| announcements | array of object { title, when, where, body, … } | optional | |
| calendar_heading | string | optional | |
| calendar | array of object { day, what, where, time } | optional | |
| prayers_heading | string | optional | |
| prayers | array of string | optional | |
| giving | object { heading, this_week_label, this_week, ytd_label, … } | optional | Values are strings so they can carry a percentage, a shortfall or a note without the template doing arithmetic on them. |
| staff_heading | string | optional | |
| staff | array of object { name, role, contact } | optional | |
| footer | string | optional |
Default render options
Applied unless you override them. Options are part of the cache key.
| page_size | "Letter" |
| margin | "0.5in" |
| print_background | true |
Example payload
This exact object renders the preview above. It is also what the API echoes back in a validation error, so an agent can repair a payload without a round trip to the docs.
{
"organisation": {
"name": "Saint Aidan's Episcopal Church",
"strapline": "A parish of the Diocese of East Carolina",
"address": "610 Orange Street, Wilmington, NC 28401",
"phone": "(910) 555-0164",
"website": "staidanswilmington.example.test"
},
"service": {
"occasion": "The Nineteenth Sunday after Pentecost",
"date": "2026-10-04",
"time": "Holy Eucharist, Rite II, 10:15 a.m.",
"location": "In the nave"
},
"welcome": "Whoever you are, you are welcome here. Nobody expects you to know when to stand. Children are welcome in the service; the nursery is through the side door.",
"order_heading": "Order of service",
"order": [
{
"title": "Prelude — Prelude in C, BWV 553",
"detail": "J. S. Bach",
"who": "Nils Brandvold, organ"
},
{
"title": "Processional hymn",
"detail": "Praise to the Lord, the Almighty",
"stand": true,
"number": "390"
},
{
"title": "Opening acclamation",
"detail": "BCP 355",
"who": "The Rector",
"stand": true
},
{
"title": "The Gloria",
"detail": "Hymnal S-280",
"stand": true
},
{
"title": "Collect of the Day",
"detail": "BCP 234",
"who": "The Rector",
"stand": true
},
{
"title": "The Word of God",
"kind": "head"
},
{
"title": "First Reading",
"detail": "Job 1:1; 2:1–10",
"who": "Oluwaseun Adebayo-Finch"
},
{
"title": "Psalm 26",
"detail": "Read responsively by whole verse"
},
{
"title": "Second Reading",
"detail": "Hebrews 1:1–4; 2:5–12",
"who": "Margery Okonkwo-Reid"
},
{
"title": "Sequence hymn",
"detail": "The King of love my shepherd is",
"stand": true,
"number": "645"
},
{
"title": "The Gospel",
"detail": "Mark 10:2–16",
"who": "The Rev. Tobias Ferrante",
"stand": true
},
{
"title": "Sermon",
"who": "The Rev. Constance Vega-Aldridge"
},
{
"title": "The Nicene Creed",
"detail": "BCP 358",
"stand": true
},
{
"title": "Prayers of the People, Form IV",
"detail": "BCP 388",
"who": "Delphine Okoro-Salt"
},
{
"title": "The Peace",
"stand": true
},
{
"title": "The Holy Communion",
"kind": "head"
},
{
"title": "Offertory anthem",
"detail": "If ye love me — Thomas Tallis",
"who": "The parish choir"
},
{
"title": "Great Thanksgiving, Prayer B",
"detail": "BCP 367",
"stand": true
},
{
"title": "Post-communion prayer",
"detail": "BCP 365",
"stand": true
},
{
"title": "Blessing and dismissal",
"who": "The Rector",
"stand": true
},
{
"title": "Recessional hymn",
"detail": "O for a thousand tongues to sing",
"stand": true,
"number": "493"
}
],
"order_note": "* Please stand as you are able. Large-print booklets, gluten-free wafers and a hearing loop are available from the ushers — just ask.",
"announcements_heading": "Notices",
"announcements": [
{
"title": "Blessing of the animals",
"when": "Saturday 10 October, 10:00 a.m.",
"where": "The memorial garden",
"body": "Bring anything that will tolerate the trip. Leashes, carriers, and — last year — one goat.",
"contact": "Ask Margery Okonkwo-Reid"
},
{
"title": "Pantry Sunday is next week",
"when": "Sunday 11 October",
"body": "Riverlight has asked for shelf-stable milk, tinned protein and nappies. Bags go in the narthex, not the parish hall."
},
{
"title": "Choir is short of altos",
"when": "Rehearsals Wednesdays, 7:00 p.m.",
"where": "Choir room",
"body": "You do not need to read music. Nils will teach you the part; he has taught worse.",
"contact": "music@staidanswilmington.example.test"
}
],
"calendar_heading": "The week ahead",
"calendar": [
{
"day": "Mon 5",
"what": "Morning Prayer",
"where": "Chapel",
"time": "8:00 a"
},
{
"day": "Wed 7",
"what": "Healing Eucharist",
"where": "Chapel",
"time": "12:10 p"
},
{
"day": "Wed 7",
"what": "Choir rehearsal",
"where": "Choir room",
"time": "7:00 p"
},
{
"day": "Thu 8",
"what": "Riverlight pantry shift",
"where": "2200 Vance St",
"time": "9:00 a"
},
{
"day": "Fri 9",
"what": "Office closed",
"time": "—"
}
],
"prayers_heading": "In our prayers",
"prayers": [
"Harriet, Nils, Delphine and Anselm, who are unwell",
"The family of Beatrix Lundqvist-Hale, who died on September 28",
"Those serving overseas: Ruben, Aoife and Tomás"
],
"giving": {
"heading": "Giving",
"this_week_label": "Last Sunday",
"this_week": "$4,182",
"ytd_label": "Year to date, against budget",
"year_to_date": "$186,400 of $194,000",
"text": "Plate, online at the address below, or by standing order, which costs the parish nothing in fees."
},
"staff_heading": "Who to ask",
"staff": [
{
"name": "The Rev. Constance Vega-Aldridge",
"role": "Rector",
"contact": "rector@staidanswilmington.example.test"
},
{
"name": "The Rev. Tobias Ferrante",
"role": "Deacon",
"contact": "deacon@staidanswilmington.example.test"
},
{
"name": "Nils Brandvold",
"role": "Director of music",
"contact": "music@staidanswilmington.example.test"
}
],
"footer": "Notices for next week by noon on Wednesday"
} Render it
curl -sS https://api.galleyrender.com/v1/render \
-H "Authorization: Bearer $GALLEY_API_KEY" \
-H 'content-type: application/json' \
-d '{
"template": "bulletin@1",
"format": "pdf",
"data": "… the example payload above …"
}' # No API key. The first call mints a trial of 10 PDF pages or 10 images.
curl -sS https://mcp.galleyrender.com/mcp \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "render",
"arguments": {
"template": "bulletin",
"format": "pdf",
"data": { … see the example payload above … }
}
}
}'
Pin the version — bulletin@1 — in anything you ship. Publishing a new
version never changes an old one. Render endpoint reference →
Renders the example payload on the production service. No account, no key.
JSON Schema
schema.json (19 top-level properties)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Weekly bulletin",
"type": "object",
"required": [
"organisation",
"service"
],
"additionalProperties": true,
"properties": {
"accent": {
"type": "string",
"description": "The one plum spot: the strapline, the section marks, the standing asterisk and the prayer marks. A hex colour or a CSS colour keyword. It is interpolated into the stylesheet, so nothing else is accepted.",
"examples": [
"#5b2a5f"
],
"default": "#5b2a5f",
"pattern": "^(#[0-9a-fA-F]{3,8}|[a-zA-Z]{3,20})$"
},
"organisation": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"Saint Aidan's Episcopal Church"
]
},
"strapline": {
"type": "string",
"examples": [
"A parish of the Diocese of East Carolina"
]
},
"address": {
"type": "string",
"examples": [
"610 Orange Street, Wilmington, NC 28401"
]
},
"phone": {
"type": "string",
"examples": [
"(910) 555-0164"
]
},
"website": {
"type": "string",
"examples": [
"staidanswilmington.example.test"
]
},
"logo_url": {
"type": "string",
"format": "uri",
"examples": [
"https://example.com/staidans.png"
]
}
}
},
"service": {
"type": "object",
"required": [
"occasion",
"date"
],
"properties": {
"occasion": {
"type": "string",
"examples": [
"The Nineteenth Sunday after Pentecost"
]
},
"date": {
"type": "string",
"format": "date",
"examples": [
"2026-10-04"
]
},
"time": {
"type": "string",
"examples": [
"Holy Eucharist, Rite II, 10:15 a.m."
]
},
"location": {
"type": "string",
"examples": [
"In the nave"
]
}
}
},
"welcome": {
"type": "string",
"description": "The short note at the top of the first column, for whoever is here for the first time.",
"examples": [
"Whoever you are, you are welcome here. There is no expectation that you know when to stand, and nobody is watching."
]
},
"order_heading": {
"type": "string",
"default": "Order of service",
"examples": [
"Order of service"
]
},
"order": {
"type": "array",
"description": "The liturgy or run of the service, in order.",
"items": {
"type": "object",
"required": [
"title"
],
"properties": {
"title": {
"type": "string",
"examples": [
"The Gloria"
]
},
"detail": {
"type": "string",
"description": "The line under the title: the first line of the hymn, a page reference, a setting or a composer.",
"examples": [
"Hymnal S-280"
]
},
"who": {
"type": "string",
"description": "Right-aligned: who leads it.",
"examples": [
"The Rev. Constance Vega-Aldridge"
]
},
"kind": {
"type": "string",
"description": "`head` draws a rule above the item, for a new part of the service.",
"enum": [
"",
"head"
],
"examples": [
"head"
]
},
"stand": {
"type": "boolean",
"default": false,
"description": "Marks the item with an asterisk, the usual sign for \"please stand as you are able\".",
"examples": [
true
]
},
"number": {
"type": "string",
"description": "The hymn or setting number, printed in a column of its own at the right of the order so the numbers align down the page.",
"examples": [
"390"
]
}
}
}
},
"order_note": {
"type": "string",
"examples": [
"* Please stand as you are able. Large-print booklets and hearing loops are at the back."
]
},
"readings_heading": {
"type": "string",
"default": "Readings",
"examples": [
"Today's readings"
]
},
"readings": {
"type": "array",
"description": "Give `text` to print the passage in a quoted block, or just `reference` for a list.",
"items": {
"type": "object",
"required": [
"reference"
],
"properties": {
"reference": {
"type": "string",
"examples": [
"Psalm 26"
]
},
"text": {
"type": "string",
"examples": [
"Give judgment for me, O Lord, for I have lived with integrity."
]
},
"reader": {
"type": "string",
"examples": [
"Oluwaseun Adebayo-Finch"
]
}
}
}
},
"announcements_heading": {
"type": "string",
"default": "This week",
"examples": [
"Notices"
]
},
"announcements": {
"type": "array",
"items": {
"type": "object",
"required": [
"title"
],
"properties": {
"title": {
"type": "string",
"examples": [
"Blessing of the animals"
]
},
"when": {
"type": "string",
"examples": [
"Saturday 10 October, 10:00 a.m."
]
},
"where": {
"type": "string",
"examples": [
"The memorial garden"
]
},
"body": {
"type": "string",
"examples": [
"Bring anything that will tolerate the trip. Leashes, carriers and, last year, one goat."
]
},
"contact": {
"type": "string",
"examples": [
"Ask Margery Okonkwo-Reid"
]
}
}
}
},
"calendar_heading": {
"type": "string",
"default": "The week ahead",
"examples": [
"The week ahead"
]
},
"calendar": {
"type": "array",
"items": {
"type": "object",
"required": [
"day",
"what"
],
"properties": {
"day": {
"type": "string",
"examples": [
"Wed 7"
]
},
"what": {
"type": "string",
"examples": [
"Choir rehearsal"
]
},
"where": {
"type": "string",
"examples": [
"Choir room"
]
},
"time": {
"type": "string",
"examples": [
"7:00 p"
]
}
}
}
},
"prayers_heading": {
"type": "string",
"default": "In our prayers",
"examples": [
"In our prayers"
]
},
"prayers": {
"type": "array",
"items": {
"type": "string",
"examples": [
"For Harriet, Nils and Delphine, who are unwell"
]
},
"examples": [
[
"For those who are unwell"
]
]
},
"giving": {
"type": "object",
"description": "Values are strings so they can carry a percentage, a shortfall or a note without the template doing arithmetic on them.",
"properties": {
"heading": {
"type": "string",
"default": "Giving",
"examples": [
"Giving"
]
},
"this_week_label": {
"type": "string",
"default": "Last Sunday",
"examples": [
"Last Sunday"
]
},
"this_week": {
"type": "string",
"examples": [
"$4,182"
]
},
"ytd_label": {
"type": "string",
"default": "Year to date, against budget",
"examples": [
"Year to date, against budget"
]
},
"year_to_date": {
"type": "string",
"examples": [
"$186,400 of $194,000"
]
},
"text": {
"type": "string",
"examples": [
"Plate, online at the address below, or by standing order. The treasurer is glad to explain any of it."
]
}
}
},
"staff_heading": {
"type": "string",
"default": "Who to ask",
"examples": [
"Who to ask"
]
},
"staff": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"The Rev. Constance Vega-Aldridge"
]
},
"role": {
"type": "string",
"examples": [
"Rector"
]
},
"contact": {
"type": "string",
"examples": [
"rector@staidanswilmington.example.test"
]
}
}
}
},
"footer": {
"type": "string",
"examples": [
"Large-print bulletins and a hearing loop are available from the ushers."
]
}
}
}