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

Rendered preview of the bulletin template
Rendered by Galley from the example payload below, at 816px wide , scale 2.

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.

example.jsonjson
{
  "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

With an API keyshell
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 …"
}'
With no API key, over MCPshell
# 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 →

Try a free tool

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."
      ]
    }
  }
}