# Set up a Keep This Day wedding website with your own AI Keep This Day is a free wedding website with RSVPs, a guest list and find-your-seat. A couple can use any AI assistant to write their setup as one JSON "wedding draft", paste it at https://keepthisday.com/host, review the live preview, and publish for free. This page is the format. Human-friendly version: https://keepthisday.com/ai. JSON Schema: https://keepthisday.com/ai/wedding-draft.schema.json. Guest CSV template: https://keepthisday.com/ai/guests-template.csv. ## What to do (for the AI) 1. Interview the couple briefly, a few questions at a time: names, date and time, venue and address, the feel they want, how they met, the schedule, travel tips, wedding party, FAQs, RSVP questions. 2. Do not invent facts. Leave out what you were not told. 3. Output ONE JSON code block in the format below. If the couple shares a guest list, also output a CSV code block with the header `name,side,group,table,seat,email,phone`. 4. Tell them to paste it at https://keepthisday.com/host and choose "Paste from your AI". ## Rules - The draft covers the free website: its info pages, the RSVP form, find-your-seat and the guest list. The day-of features (guest photo album, love notes, voice messages, drawn portraits, trivia and favours, venue screen, check-in, gallery) have no fields in the draft and are never switched on by it. A connected assistant fills in trivia, favours and the guestbook note with its own day-of tool, and guests see them once the couple has unlocked the day-of features. - A draft never goes live by itself. After pasting, the couple reviews the preview, signs in and publishes. A connected assistant publishes only when the couple tells it to. - Leave out anything unknown instead of guessing. Unknown keys are ignored. Invalid values are skipped with a message, and the rest still loads. - Photos are not part of the draft. The couple adds a cover photo in the editor, or a connected assistant sets one from a photo link (a sample photo is used until then). - Guest details are personal information. They are never put in a link or sent anywhere until the couple has signed in, and are then saved through the normal guest list importer. - Dates are YYYY-MM-DD and times are 24-hour HH:MM. Links must be https. Colours are hex like #b85c7a. - Copy rules for everything guests read: plain and specific, in the couple's own words. No slogans, no em dashes. ## Themes (field `theme`) - `editorial` (Cloud): White and deep navy, with periwinkle details. - `botanical` (Something blue): Soft blue with watercolour flowers. - `rose` (Blush): Pale pink and raspberry. - `midnight` (Afterglow): Near black and amber, for an evening wedding. - `azure` (Coast): Sea glass and bright blue. - `coral` (Terracotta): Warm clay and dark cocoa. ## Fields - `couple` (object): The two people getting married. - `couple.partner1` (text, up to 60): Required. First partner's name as it should appear, e.g. "Maya". - `couple.partner2` (text, up to 60): Required. Second partner's name, e.g. "Daniel". - `date` (YYYY-MM-DD): Wedding date as YYYY-MM-DD. Leave out if it is not decided. - `time` (HH:MM): Start time, 24-hour HH:MM, e.g. "16:30". Leave out if unknown. - `venue` (object): Where it happens. - `venue.name` (text, up to 120): Venue name. - `venue.address` (text, up to 240): Street address. - `venue.map_url` (https link): Google Maps or Apple Maps link (https). - `theme` (editorial | botanical | rose | midnight | azure | coral): Look of the website. One of: editorial (Cloud), botanical (Something blue), rose (Blush), midnight (Afterglow), azure (Coast), coral (Terracotta). - `appearance` (object): Optional fine-tuning on top of the theme. Leave out to keep the theme's own look. - `appearance.font` (serif | sans | script): Heading font: serif (editorial), sans (modern), script (romantic). - `appearance.layout` (immersive | framed | split): Cover layout: immersive (full photo), framed, or split. - `appearance.colors` (object): Only set colours the couple actually asked for. - `appearance.colors.background` (#rrggbb): Page background, hex like #fff9f8. - `appearance.colors.text` (#rrggbb): Text colour, hex. - `appearance.colors.accent` (#rrggbb): Buttons and highlights, hex. - `headline` (text, up to 300): A short welcome shown on the cover, in the couple's own words. Plain, no slogans. - `dress_code` (text, up to 600): Dress code, e.g. "Garden party, light colours". - `hashtag` (text, up to 60): Wedding hashtag, if they have one. - `schedule[]` (list of objects): The day's schedule, in order. Up to 40. - `schedule[].time` (text, up to 20): Display time, e.g. "4:00 PM". - `schedule[].title` (text, up to 120): What happens, e.g. "Ceremony". - `schedule[].note` (text, up to 240): Optional detail, e.g. "Doors open at 3:30 PM". - `pages` (object): The website's info pages. A page with content is switched on automatically. - `pages.story` (object): Our story. - `pages.story.on` (true | false): Show this page. Defaults to true when the page has content. - `pages.story.title` (text, up to 80): Page title, e.g. "How we met". - `pages.story.body` (text, up to 6000): The story. Separate paragraphs with a blank line. - `pages.travel` (object): Travel and stay. - `pages.travel.on` (true | false): Show this page. Defaults to true when the page has content. - `pages.travel.intro` (text, up to 2000): Intro text. - `pages.travel.items[]` (list of objects): Places to stay or ways to get there. Up to 20. - `pages.travel.items[].name` (text, up to 120): Name. - `pages.travel.items[].detail` (text, up to 1200): A line or two of detail. - `pages.travel.items[].url` (https link): Link (https). - `pages.party` (object): The wedding party. - `pages.party.on` (true | false): Show this page. Defaults to true when the page has content. - `pages.party.intro` (text, up to 1000): Intro text. - `pages.party.people[]` (list of objects): The people in the wedding party. Up to 40. - `pages.party.people[].name` (text, up to 80): Name. - `pages.party.people[].role` (text, up to 60): Role, e.g. "Best man". - `pages.party.people[].note` (text, up to 400): A line about them. - `pages.todo` (object): Things to do nearby. - `pages.todo.on` (true | false): Show this page. Defaults to true when the page has content. - `pages.todo.intro` (text, up to 2000): Intro text. - `pages.todo.items[]` (list of objects): Things to see and do. Up to 30. - `pages.todo.items[].name` (text, up to 120): Name. - `pages.todo.items[].detail` (text, up to 1200): A line or two of detail. - `pages.todo.items[].url` (https link): Link (https). - `pages.gifts` (object): A note about gifts. - `pages.gifts.on` (true | false): Show this page. Defaults to true when the page has content. - `pages.gifts.intro` (text, up to 2000): What the couple would like to say about gifts. - `pages.gifts.items[]` (list of objects): Registry or gift links. Up to 12. - `pages.gifts.items[].name` (text, up to 120): Name. - `pages.gifts.items[].detail` (text, up to 1200): A line or two of detail. - `pages.gifts.items[].url` (https link): Link (https). - `pages.faq` (object): Questions and answers. - `pages.faq.on` (true | false): Show this page. Defaults to true when the page has content. - `pages.faq.items[]` (list of objects): Questions guests ask. Up to 40. - `pages.faq.items[].q` (text, up to 200): Question. - `pages.faq.items[].a` (text, up to 2000): Answer. - `rsvp` (object): What the RSVP form asks. - `rsvp.enabled` (true | false): Turn online RSVP on. Defaults to true. - `rsvp.deadline` (YYYY-MM-DD): Reply-by date, YYYY-MM-DD. - `rsvp.meals[]` (list of text): Meal choices, if guests pick one. Up to 8. - `rsvp.dietary` (true | false): Ask about dietary needs. Defaults to true. - `rsvp.song` (true | false): Ask for a song request. Defaults to false. - `rsvp.questions[]` (list of objects): Your own extra questions. Up to 10. - `rsvp.questions[].question` (text, up to 200): The question text. - `rsvp.questions[].kind` (text | choice): text for a free answer, choice for a list of options. - `rsvp.questions[].options[]` (list of text): Options. Needed (2 or more) when kind is choice. Up to 8. - `rsvp.questions[].required` (true | false): Guests must answer. - `seating` (object): Find-your-seat. Guests search their name and see their table. Table numbers come from the guest list. - `seating.enabled` (true | false): Turn find-your-seat on. - `seating.note` (text, up to 300): A note shown above the seating search. - `guests[]` (list of objects): Optional. Guests contain personal details: they are only saved after the couple signs in, through the guest list importer. Up to 1000. - `guests[].name` (text, up to 120): Full name. - `guests[].side` (bride | groom | both | neither): Whose side. Leave out if unsure. - `guests[].group` (text, up to 80): Group, e.g. "College friends". - `guests[].table` (text, up to 60): Table name or number. - `guests[].seat` (text, up to 30): Seat. - `guests[].email` (text, up to 200): Email. - `guests[].phone` (text, up to 40): Phone. ## Example ```json { "format": "keepthisday.wedding-draft", "version": 1, "couple": { "partner1": "Maya", "partner2": "Daniel" }, "date": "2027-06-12", "time": "16:30", "venue": { "name": "The Garden Pavilion", "address": "12 Orchard Lane, Singapore 238801", "map_url": "https://maps.google.com/?q=The+Garden+Pavilion" }, "theme": "botanical", "headline": "We are getting married and we would love you there. Find everything below.", "dress_code": "Garden party. Light colours please.", "schedule": [ { "time": "3:30 PM", "title": "Guests arrive", "note": "Welcome drinks on the lawn" }, { "time": "4:30 PM", "title": "Ceremony" }, { "time": "6:30 PM", "title": "Dinner", "note": "Seated by table" } ], "pages": { "story": { "title": "How we met", "body": "We met in 2019 at a friend's housewarming.\n\nDaniel proposed on the same balcony five years later." }, "travel": { "intro": "The venue has free parking.", "items": [ { "name": "Hotel Orchard", "detail": "10 minutes away. Mention the wedding for a rate.", "url": "https://example.com/hotel" } ] }, "faq": { "items": [ { "q": "Can I bring a plus one?", "a": "Your invitation says who is invited." }, { "q": "Is there parking?", "a": "Yes, free parking on site." } ] } }, "rsvp": { "deadline": "2027-05-01", "meals": [ "Beef", "Fish", "Vegetarian" ], "dietary": true, "song": true, "questions": [ { "question": "Will you need a ride from the hotel?", "kind": "choice", "options": [ "Yes", "No" ] } ] }, "seating": { "enabled": true, "note": "Find your table before dinner." }, "guests": [ { "name": "Grace Tan", "side": "bride", "group": "College friends", "table": "6", "seat": "1", "email": "grace@example.com" }, { "name": "Priya Nair", "side": "groom", "group": "Work", "table": "12" } ] } ``` ## Guest list CSV Columns: `name,side,group,table,seat,email,phone` - The first row is the header. Only `name` is required. - `side` is bride, groom, both or neither (blank means both). - `group` is how the couple groups guests, for example Family or Work. It drives grouped check-in. - `table` and `seat` feed find-your-seat. Table labels are shown as written. - `email` and `phone` are used for invitations. Both are optional. - Up to 1,000 guests per wedding. ```csv name,side,group,table,seat,email,phone Grace Tan,bride,College friends,6,1,grace@example.com,+65 9123 4567 Daniel Lee,groom,Family,1,3,, Priya Nair,both,Work,12,,priya@example.com, ```