{
  "name": "Toast",
  "slug": "toast",
  "blocks": ["Pages", "Lists", "Sign-in: users"],
  "persona": "events",
  "keywords": [
    "wedding",
    "wedding RSVP",
    "RSVP app",
    "meal choices",
    "guest list",
    "wedding website",
    "private details",
    "save the date",
    "wedding invitation",
    "plus-one",
    "wedding guest app",
    "dinner choices",
    "seating table",
    "guest sign-in"
  ],
  "description": "An invite-only app template for a wedding: each invited guest signs in with the email their invitation went to, replies for every adult on it (coming or not, main course, dessert, a song), sees the couple confirm each reply, and finds the order of the day, travel, places to stay and their table in one place. A public save-the-date page, six member pages under /app and a privacy notice with blanks.",
  "audience": [
    "couples planning a wedding with a sit-down meal",
    "families and friends running a wedding with a guest list",
    "wedding planners sending invitations by email"
  ],
  "category": "Membership",
  "job": "member-app",
  "categoryId": "membership",
  "alsoFits": [
    "wedding RSVP",
    "party guest list",
    "anniversary dinner",
    "christening lunch",
    "members-only events"
  ],
  "direction": "Stationery suite on linen: ink navy and dusty rose, an envelope with a pressed-flower liner and a pen-ticked reply card",
  "mood": [
    "light",
    "calm",
    "classic"
  ],
  "fonts": [
    "Bodoni Moda",
    "Albert Sans"
  ],
  "features": {
    "protect": "The RSVP, the meal choices and the private details (table, parking, places to stay) sit behind the invitation sign-in; the public page shows only the day and the place.",
    "coEdit": "The couple can both edit the guest list, the replies and the table plan in the Dashboard, and add one more person to help with the seating."
  },
  "memberApp": {
    "path": "/app",
    "lists": [
      {
        "list": "replies",
        "label": "Guest replies",
        "by": "member",
        "status_options": [
          "Received",
          "Confirmed"
        ],
        "reply": true,
        "fields": [
          {
            "name": "guest_name",
            "type": "text",
            "label": "Guest's name",
            "required": true
          },
          {
            "name": "coming",
            "type": "choice",
            "label": "Coming?",
            "required": true,
            "options": [
              "Yes",
              "No"
            ]
          },
          {
            "name": "meal",
            "type": "choice",
            "label": "Main course",
            "options": [
              "Slow-roast lamb",
              "Wild mushroom wellington (V)",
              "Hake with samphire"
            ]
          },
          {
            "name": "dessert",
            "type": "choice",
            "label": "Dessert",
            "options": [
              "Lemon posset",
              "Chocolate torte"
            ]
          },
          {
            "name": "song",
            "type": "text",
            "label": "A song to get you dancing"
          }
        ]
      },
      {
        "list": "invitation",
        "label": "Names on the invitation",
        "by": "owner",
        "fields": [
          {
            "name": "guest_name",
            "type": "text",
            "label": "Guest's name",
            "required": true
          }
        ]
      },
      {
        "list": "table",
        "label": "Table plan",
        "by": "owner",
        "fields": [
          {
            "name": "table",
            "type": "text",
            "label": "Table"
          },
          {
            "name": "seat_with",
            "type": "text",
            "label": "Seated with"
          }
        ]
      }
    ],
    "demo": {
      "member": {
        "name": "Naomi Fairweather",
        "email": "naomi.fairweather@example.com",
        "profile": {
          "name": "Naomi"
        }
      },
      "plans": [],
      "rows": {
        "replies": [
          {
            "guest_name": "Isla Fairweather",
            "coming": "No",
            "_added": "-3d",
            "_status": "Confirmed",
            "_reply": "We'll miss you, Isla. Save us a dance at the next one."
          },
          {
            "guest_name": "Euan Fairweather",
            "coming": "Yes",
            "meal": "Wild mushroom wellington (V)",
            "dessert": "Lemon posset",
            "song": "Mr Brightside",
            "_added": "-6d",
            "_status": "Received"
          },
          {
            "guest_name": "Naomi Fairweather",
            "coming": "Yes",
            "meal": "Hake with samphire",
            "dessert": "Chocolate torte",
            "song": "September",
            "_added": "-6d",
            "_status": "Confirmed",
            "_reply": "So happy you're coming! You're on Table Four, by the orchard doors."
          }
        ],
        "table": [
          {
            "table": "Four",
            "seat_with": "you, Euan Fairweather, Hester Ashcombe, Lukas Ferreira and Mei Tan",
            "_added": "-1d"
          }
        ],
        "invitation": [
          {
            "guest_name": "Naomi Fairweather",
            "_added": "-8w:mon"
          },
          {
            "guest_name": "Euan Fairweather",
            "_added": "-8w:mon"
          },
          {
            "guest_name": "Isla Fairweather",
            "_added": "-8w:mon"
          }
        ]
      }
    },
    "setup": {
      "signup": "invite",
      "profile_fields": [
        {
          "name": "name",
          "type": "text",
          "label": "First name"
        }
      ],
      "display_field": "name"
    }
  },
  "files": [
    "index.html",
    "privacy.html",
    "app/index.html",
    "app/reply.html",
    "app/day.html",
    "app/travel.html",
    "app/table.html",
    "app/account.html",
    "styles.css",
    "app.js",
    "wedding.ics",
    "kit.css",
    "kit.js",
    "kit-icons.svg",
    "icons.svg",
    "site.webmanifest",
    "favicon.svg",
    "art/hero-sprig.svg",
    "art/barn.svg",
    "art/stem-rose.svg",
    "art/stem-sage.svg",
    "art/stem-gold.svg",
    "art/liner.svg",
    "art/deckle.svg",
    "art/map.svg",
    "og.png",
    "apple-touch-icon.png",
    "icon-192.png",
    "icon-512.png",
    "icon-512-maskable.png"
  ],
  "pages": [
    {
      "path": "index.html",
      "label": "Save the date",
      "purpose": "The public page: the couple, the date and venue, the shape of the day and a Sign in to reply button"
    },
    {
      "path": "app/index.html",
      "label": "Home",
      "purpose": "The guest's home: greeting, the countdown card with replies sent and coming, quick actions, their latest replies with the couple's status, their table and what to do next; a welcome screen when signed out"
    },
    {
      "path": "app/reply.html",
      "label": "Reply",
      "purpose": "The names on the guest's invitation with Reply buttons, the reply form (coming, main, dessert, a song), and the replies sent with Received or Confirmed and the couple's note"
    },
    {
      "path": "app/day.html",
      "label": "The day",
      "purpose": "The order of the day from 13:30 to carriages at midnight, the barn, dress code and gifts"
    },
    {
      "path": "app/travel.html",
      "label": "Travel",
      "purpose": "Parking, the lane, train and the minibus home, and three places to stay with prices and the wedding-rate deadline"
    },
    {
      "path": "app/table.html",
      "label": "Table",
      "purpose": "The guest's place card (table and who they sit with) once the couple sets it, and the menu"
    },
    {
      "path": "app/account.html",
      "label": "Account",
      "purpose": "The guest's first name, the account block (sign-in, devices, leaving) and how to change a reply"
    },
    {
      "path": "privacy.html",
      "label": "Privacy",
      "purpose": "The privacy notice, with blanks the couple fills in"
    }
  ],
  "facts": [
    "the couple's names",
    "the wedding day and date",
    "the ceremony, dinner and carriages times",
    "the venue address and map link",
    "parking and dress code",
    "three places to stay nearby",
    "the reply-by date",
    "the contact email and phone",
    "the privacy contact and address"
  ],
  "interview": [
    "What are your names, and what is the wedding day and date?",
    "Where is the wedding, and what are the ceremony, dinner and carriages times?",
    "What are the main course and dessert choices for your guests, and what is the reply-by date?",
    "Which places to stay are nearby, and how far is each from the venue?",
    "Who should guests write to with questions, and what phone number should they call?",
    "Which guests get a sign-in: the email each invitation was sent to?",
    "What address and privacy contact should the privacy notice show?"
  ],
  "customise": {
    "strings": [
      "Imogen Ashcombe and Rafael Quintero-Byrne, Saturday 4 September 2027, Hartsfell Barn, Hartsfell Lane, Coldwater Edge QZ3 8PD, the reply-by date 31 July, rsvp@imogenandrafa.example.com and 07700 900 730 are the sample facts: replace them on every page and in site.webmanifest.name. The countdown reads data-s-countdown=\"2027-09-04\" on app/index.html: change it too.",
      "Fill in every highlighted blank on privacy.html with the couple before guests use the site (not legal advice: https://pagelemon.com/agents/member-app-legal).",
      "setup_app with signup invite, the profile field name (First name) and display_field name; then invite_users with each invitation's email.",
      "Make the replies list exactly as memberApp.lists says, with status_options Received and Confirmed and reply on. The couple confirms each reply in the Dashboard (Apps, Entries) with one status tap and, if they like, a short note the guest sees under it. Meal and dessert choices are the list's options: change them in app/reply.html too, in the same order, and keep (V) on the vegetarian main.",
      "Make the invitation list (by owner) exactly as memberApp.lists says: one row per adult named on an invitation, assigned to the guest who signs in. app/reply.html lists them with a Reply button that fills in the name.",
      "The table list (by owner): the couple assigns each guest a table and a seated-with line in August; the guest's place card shows on app/table.html and Home.",
      "The order of the day, places to stay and menu are sample text on app/day.html, app/travel.html and app/table.html: replace them with the couple's own.",
      "Wedding only: keep the replies to the list's fields. Guests send dietary and other needs to the couple by email, not through the form. Never ask for card, bank or ID numbers."
    ],
    "colours": "Edit the tokens at the top of styles.css: cotton #FBFAF7 card stock on a linen #EFEAE0 table, ink navy #1E2A4A, dusty rose #D9A3A0 (the envelope liner and your table), sage #9DB09A, and gold foil #C9A45C only on navy or as hairlines. The dark scheme follows the device: a navy night with the cards by candlelight. The Day page is the navy night view in both schemes (ts-night on its body).",
    "fonts": "Google Fonts: Bodoni Moda (display: the names, the date, times, headings, in italic) and Albert Sans (text and labels), one <link> in every page head and --ts-serif / --ts-sans in styles.css. If the couple prefers no font service, download both (OFL) into a fonts/ folder and switch to @font-face.",
    "sections": "Public: index.html (the save-the-date poster: the names and the date, the invitation in its open envelope, a sample reply card and place card, the order of the day on navy, the folded map, sign-in) and privacy.html. Member pages under /app on the shared app kit (kit.css, kit.js, kit-icons.svg; never edit them): index.html (the invitation in its envelope, the reply card with a pen tick per name, the place card, the replies with the couple's notes), reply.html (the reply card large with the add form written on it, and the replies sent with status and note), day.html (the order of the day as a gold-ruled programme on navy), travel.html (the folded map card, getting there, three places to stay keyed A to C), table.html (the place card from the table list, the drawn table plan with the guest's table in rose, the menu, the party's choices), account.html (the account parts as stationery sheets). Tabs: Home, Reply, The day, Travel, Table. Template pieces are the ts-* classes in styles.css; app.js does the countdown, the pen ticks, the falling petals, the reply form and marks the guest's table on the plan (the table field must match a table name in the plan's data-ts-table).",
    "images": "Drawn art, no photos: art/hero-sprig.svg (the pressed sprig on the invitation), art/stem-rose.svg, art/stem-sage.svg and art/stem-gold.svg (pressed stems, 240×480), art/liner.svg (the envelope liner tile), art/deckle.svg (the invitation's deckled edge, a mask), art/barn.svg (the barn at night, 1200×800) and art/map.svg (the folded map, 1200×800: redraw it for the couple's venue). The table plan is inline SVG on app/table.html: rename the tables to match the couple's plan. icons.svg holds the extra icons (ring, glass, bed, car, pen, music)."
  },
  "updated": "2026-10-21",
  "schemaVersion": 2
}
