{
  "name": "Chapter",
  "slug": "chapter",
  "blocks": ["Pages", "Lists", "Sign-in: users", "Actions: scan"],
  "persona": "community",
  "keywords": [
    "book club",
    "reading group",
    "vote on books",
    "book discussion",
    "join a book club",
    "members app",
    "reading list",
    "literary society",
    "monthly meeting",
    "book club app",
    "book club members",
    "member sign-in"
  ],
  "description": "An app template for an invite-only monthly book club: members see the next meeting and its book, say if they're coming, vote on the next book from a shortlist and see the result, log the page they're on and see the pace to finish, send notes the host reads out in the room, and check in at the door with a code, so every tenth meeting earns a free paperback. A public page, seven member pages under /app and a privacy notice with blanks.",
  "audience": [
    "book clubs and reading groups that vote on their own books",
    "literary societies with a small, approved membership",
    "monthly meetings that want notes from members before they meet"
  ],
  "category": "Membership",
  "job": "member-app",
  "categoryId": "membership",
  "alsoFits": [
    "poetry society",
    "film club",
    "writing group",
    "library friends group",
    "theatre reading circle"
  ],
  "direction": "Dust jackets by lamplight: an oxblood poster, Cormorant italics, spines on a shelf and a stamped library card",
  "mood": [
    "light",
    "calm",
    "classic"
  ],
  "fonts": [
    "Cormorant Garamond",
    "Josefin Sans"
  ],
  "memberApp": {
    "path": "/app",
    "setup": {
      "signup": "invite",
      "profile_fields": [
        {
          "name": "name",
          "type": "text",
          "label": "First name"
        }
      ],
      "display_field": "name"
    },
    "lists": [
      {
        "list": "rsvps",
        "label": "Meeting replies",
        "by": "member",
        "fields": [
          {
            "name": "meeting",
            "type": "text",
            "label": "Which meeting?",
            "required": true
          },
          {
            "name": "coming",
            "type": "choice",
            "label": "Are you coming?",
            "required": true,
            "options": [
              "Yes",
              "Maybe",
              "No"
            ]
          },
          {
            "name": "bringing",
            "type": "text",
            "label": "Bringing something for the table?"
          }
        ]
      },
      {
        "list": "votes",
        "label": "Book votes",
        "by": "member",
        "fields": [
          {
            "name": "book",
            "type": "text",
            "label": "Your pick",
            "required": true
          },
          {
            "name": "why",
            "type": "long_text",
            "label": "Why this one?",
            "required": true
          },
          {
            "name": "poll",
            "type": "text",
            "label": "Which vote",
            "required": true
          }
        ]
      },
      {
        "list": "thoughts",
        "label": "Notes for the meeting",
        "by": "member",
        "status_options": [
          "Received",
          "On Maud's list",
          "Read out"
        ],
        "reply": true,
        "fields": [
          {
            "name": "book",
            "type": "text",
            "label": "Book",
            "required": true
          },
          {
            "name": "rating",
            "type": "choice",
            "label": "Your rating",
            "required": true,
            "options": [
              "5",
              "4",
              "3",
              "2",
              "1"
            ]
          },
          {
            "name": "thoughts",
            "type": "long_text",
            "label": "Your thoughts",
            "required": true
          },
          {
            "name": "favourite_line",
            "type": "text",
            "label": "A line you'd like read out"
          },
          {
            "name": "read_as",
            "type": "choice",
            "label": "Read it out",
            "required": true,
            "options": [
              "With my name",
              "Without my name"
            ]
          }
        ]
      },
      {
        "list": "pages",
        "label": "Reading progress",
        "by": "member",
        "fields": [
          {
            "name": "book",
            "type": "text",
            "label": "Book",
            "required": true
          },
          {
            "name": "on_page",
            "type": "number",
            "label": "Page",
            "required": true
          },
          {
            "name": "line",
            "type": "text",
            "label": "Where in the book"
          }
        ]
      },
      {
        "list": "attendance",
        "label": "Meetings attended",
        "by": "owner",
        "fields": [
          {
            "name": "item",
            "type": "text",
            "label": "For",
            "required": true
          }
        ]
      }
    ],
    "scan": [
      {
        "list": "attendance",
        "actions": [
          {
            "label": "At the meeting",
            "values": {
              "item": "Meeting attended"
            },
            "goal": 10,
            "daily_limit": 1
          },
          {
            "label": "Free paperback",
            "redeem": 10,
            "from": "At the meeting"
          }
        ]
      }
    ],
    "demo": {
      "member": {
        "name": "Beatrix Oyelaran",
        "email": "beatrix.oyelaran@example.com",
        "profile": {
          "name": "Beatrix"
        }
      },
      "plans": [],
      "rows": {
        "rsvps": [
          {
            "meeting": "{day:0m:2wed} · The Salt Clock",
            "coming": "Yes",
            "bringing": "Shortbread from Vellum Row",
            "_added": "-9d"
          },
          {
            "meeting": "{day:+1m:2wed} · The Ferryman's Almanac",
            "coming": "Maybe",
            "bringing": "",
            "_added": "-9d"
          }
        ],
        "votes": [
          {
            "book": "Nightjar Road",
            "poll": "{month:+2m:2wed}",
            "why": "The sisters' argument over the letters is the best scene on any shortlist this year, and it's short enough for a dark winter evening.",
            "_added": "-10d"
          }
        ],
        "thoughts": [
          {
            "book": "The Salt Clock",
            "rating": "4",
            "thoughts": "Two-thirds in: the tide tables do the work of a second narrator. I keep checking the margins the way she does, and I trust her more than the harbour office.",
            "favourite_line": "The sea keeps its own timetable and does not need our permission.",
            "_added": "-9d",
            "_status": "Received",
            "read_as": "With my name"
          },
          {
            "book": "The Lantern Mill",
            "rating": "4",
            "thoughts": "I didn't expect to care about the mill ledger, but the foreman's handwriting slowly changing had me checking back through the pages. Slow in the middle, worth it at the end.",
            "favourite_line": "A mill makes its noise so the town forgets to listen.",
            "_added": "-1m:2wed",
            "_status": "Read out",
            "_reply": "Read out first, Beatrix. The ledger line started the best twenty minutes of the night. Thank you.",
            "read_as": "With my name"
          },
          {
            "book": "Glasshouse Winter",
            "rating": "3",
            "thoughts": "Lovely descriptions of the greenhouse, but I wanted more from the daughter. I changed my mind about the ending twice on the walk home.",
            "_added": "-2m:2wed",
            "_status": "Read out",
            "_reply": "Half the room agreed about the daughter. Tomasz has a theory for you.",
            "read_as": "With my name"
          }
        ],
        "attendance": [
          {
            "item": "Meeting attended",
            "_added": "-1m:2wed"
          },
          {
            "item": "Meeting attended",
            "_added": "-2m:2wed"
          },
          {
            "item": "Meeting attended",
            "_added": "-3m:2wed"
          },
          {
            "item": "Meeting attended",
            "_added": "-4m:2wed"
          },
          {
            "item": "Meeting attended",
            "_added": "-5m:2wed"
          },
          {
            "item": "Meeting attended",
            "_added": "-6m:2wed"
          },
          {
            "item": "Meeting attended",
            "_added": "-7m:2wed"
          },
          {
            "item": "Meeting attended",
            "_added": "-8m:2wed"
          },
          {
            "item": "Meeting attended",
            "_added": "-9m:2wed"
          }
        ],
        "pages": [
          {
            "book": "The Salt Clock",
            "line": "The storm chapter, told the second time.",
            "_added": "-9d",
            "on_page": 214
          },
          {
            "book": "The Salt Clock",
            "line": "She finds the second logbook.",
            "_added": "-16d",
            "on_page": 140
          },
          {
            "book": "The Salt Clock",
            "_added": "-23d",
            "on_page": 62
          }
        ]
      },
      "staff": {
        "members": [
          {
            "name": "Beatrix",
            "counts": {
              "At the meeting": 9
            },
            "since": "2026-01-14"
          },
          {
            "name": "Tomasz",
            "counts": {
              "At the meeting": 10
            },
            "since": "-120w:wed"
          },
          {
            "name": "Gwen",
            "counts": {
              "At the meeting": 9
            },
            "since": "-160w:wed"
          },
          {
            "name": "Olu",
            "counts": {
              "At the meeting": 8
            },
            "since": "-60w:wed"
          },
          {
            "name": "Harriet",
            "counts": {
              "At the meeting": 6
            },
            "since": "-90w:wed"
          },
          {
            "name": "Ruth",
            "counts": {
              "At the meeting": 5
            },
            "since": "-33w:wed"
          },
          {
            "name": "Priya",
            "counts": {
              "At the meeting": 4
            },
            "since": "-19w:wed"
          },
          {
            "name": "Idris",
            "counts": {
              "At the meeting": 2
            },
            "since": "-6w:wed"
          },
          {
            "name": "Alun",
            "counts": {
              "At the meeting": 9
            },
            "since": "-200w:wed"
          },
          {
            "name": "Delphine",
            "counts": {
              "At the meeting": 7
            },
            "since": "-75w:wed"
          },
          {
            "name": "Kofi",
            "counts": {
              "At the meeting": 3
            },
            "since": "-15w:wed"
          },
          {
            "name": "Marguerite",
            "counts": {
              "At the meeting": 9
            },
            "since": "-260w:wed"
          },
          {
            "name": "Sanjay",
            "counts": {
              "At the meeting": 6
            },
            "since": "-48w:wed"
          },
          {
            "name": "Elspeth",
            "counts": {
              "At the meeting": 8
            },
            "since": "-140w:wed"
          },
          {
            "name": "Wren",
            "counts": {
              "At the meeting": 1
            },
            "since": "-1w:wed"
          },
          {
            "name": "Yusuf",
            "counts": {
              "At the meeting": 5
            },
            "since": "-40w:wed"
          },
          {
            "name": "Clemency",
            "counts": {
              "At the meeting": 9
            },
            "since": "-180w:wed"
          },
          {
            "name": "Rhiannon",
            "counts": {
              "At the meeting": 4
            },
            "since": "-23w:wed"
          },
          {
            "name": "Fergus",
            "counts": {
              "At the meeting": 7
            },
            "since": "-100w:wed"
          },
          {
            "name": "Noor",
            "counts": {
              "At the meeting": 3
            },
            "since": "-10w:wed"
          }
        ],
        "log": [
          {
            "name": "Marguerite",
            "action": "At the meeting",
            "at": "19:02",
            "by": "Maud"
          },
          {
            "name": "Tomasz",
            "action": "At the meeting",
            "at": "19:06",
            "by": "Maud"
          },
          {
            "name": "Alun",
            "action": "At the meeting",
            "at": "19:09",
            "by": "Maud"
          },
          {
            "name": "Olu",
            "action": "At the meeting",
            "at": "19:14",
            "by": "Maud"
          },
          {
            "name": "Priya",
            "action": "At the meeting",
            "at": "19:21",
            "by": "Maud"
          },
          {
            "name": "Idris",
            "action": "At the meeting",
            "at": "19:27",
            "by": "Maud"
          }
        ],
        "queue": [
          {
            "name": "Gwen",
            "status": "Received",
            "values": {
              "book": "The Salt Clock",
              "rating": "4",
              "thoughts": "I read it in two sittings. The widow's lists made me want to keep a tide diary of my own, and I'm still not sure the husband lied.",
              "favourite_line": "A clock that runs on salt runs slow in the rain.",
              "read_as": "With my name"
            }
          },
          {
            "name": "Tomasz",
            "status": "On Maud's list",
            "values": {
              "book": "The Salt Clock",
              "rating": "3",
              "thoughts": "Beautiful sentences, but the harbour office plot ran out of steam halfway. I'd like to ask the room whether the ending is a cheat.",
              "favourite_line": "Every keeper lies once, to the sea.",
              "read_as": "With my name"
            }
          },
          {
            "name": "Priya",
            "status": "Received",
            "values": {
              "book": "The Salt Clock",
              "rating": "5",
              "thoughts": "The best book this season. The storm chapter is told twice and both versions are true. Please don't read my name out.",
              "read_as": "Without my name"
            }
          },
          {
            "name": "Delphine",
            "status": "On Maud's list",
            "values": {
              "book": "The Salt Clock",
              "rating": "4",
              "thoughts": "I kept thinking about who gets to write the official record, and who only gets the margins.",
              "favourite_line": "She wrote the tide down so it could not argue.",
              "read_as": "With my name"
            }
          }
        ],
        "copy": {
          "show": "Show this to Maud at the door.",
          "scanTitle": "Door phone",
          "scanHint": "Point the camera at the member's code as they come in.",
          "noun": "meeting",
          "nouns": "meetings",
          "logTitle": "Last meeting night",
          "daily": "one per meeting night",
          "next": "next meeting"
        },
        "views": [
          "rsvps",
          "votes"
        ],
        "tally": {
          "rsvps": "coming",
          "votes": "book"
        },
        "entries": {
          "rsvps": [
            {
              "name": "Tomasz",
              "values": {
                "meeting": "Wed 11 Nov · The Salt Clock",
                "coming": "Yes",
                "bringing": "A lemon drizzle"
              },
              "added": "-1d"
            },
            {
              "name": "Gwen",
              "values": {
                "meeting": "Wed 11 Nov · The Salt Clock",
                "coming": "Yes"
              },
              "added": "-2d"
            },
            {
              "name": "Olu",
              "values": {
                "meeting": "Wed 11 Nov · The Salt Clock",
                "coming": "Yes",
                "bringing": "Flapjacks"
              },
              "added": "-3d"
            },
            {
              "name": "Harriet",
              "values": {
                "meeting": "Wed 11 Nov · The Salt Clock",
                "coming": "Maybe"
              },
              "added": "-4d"
            },
            {
              "name": "Ruth",
              "values": {
                "meeting": "Wed 11 Nov · The Salt Clock",
                "coming": "Yes",
                "bringing": "Oatcakes and cheese"
              },
              "added": "-5d"
            },
            {
              "name": "Priya",
              "values": {
                "meeting": "Wed 11 Nov · The Salt Clock",
                "coming": "Yes"
              },
              "added": "-1d"
            },
            {
              "name": "Idris",
              "values": {
                "meeting": "Wed 11 Nov · The Salt Clock",
                "coming": "No"
              },
              "added": "-2d"
            },
            {
              "name": "Alun",
              "values": {
                "meeting": "Wed 11 Nov · The Salt Clock",
                "coming": "Yes",
                "bringing": "A pot of damson jam"
              },
              "added": "-3d"
            },
            {
              "name": "Delphine",
              "values": {
                "meeting": "Wed 11 Nov · The Salt Clock",
                "coming": "Yes"
              },
              "added": "-4d"
            },
            {
              "name": "Kofi",
              "values": {
                "meeting": "Wed 11 Nov · The Salt Clock",
                "coming": "Maybe"
              },
              "added": "-5d"
            },
            {
              "name": "Marguerite",
              "values": {
                "meeting": "Wed 11 Nov · The Salt Clock",
                "coming": "Yes",
                "bringing": "Ginger biscuits"
              },
              "added": "-1d"
            },
            {
              "name": "Elspeth",
              "values": {
                "meeting": "Wed 11 Nov · The Salt Clock",
                "coming": "Yes"
              },
              "added": "-2d"
            }
          ],
          "votes": [
            {
              "name": "Tomasz",
              "values": {
                "book": "Orchard of Glass",
                "poll": "January 2027",
                "why": "A family saga for the dark months."
              },
              "added": "-1d"
            },
            {
              "name": "Gwen",
              "values": {
                "book": "Nightjar Road",
                "poll": "January 2027",
                "why": "Short, sharp, and we haven't had letters since spring."
              },
              "added": "-2d"
            },
            {
              "name": "Olu",
              "values": {
                "book": "The Weather in Ardmoor",
                "poll": "January 2027",
                "why": "A diary novel would split the room nicely."
              },
              "added": "-3d"
            },
            {
              "name": "Priya",
              "values": {
                "book": "Nightjar Road",
                "poll": "January 2027",
                "why": "The bird-watching society scenes are wonderful."
              },
              "added": "-4d"
            },
            {
              "name": "Alun",
              "values": {
                "book": "A Map of Borrowed Rooms",
                "poll": "January 2027",
                "why": "Something stranger after three quiet books."
              },
              "added": "-5d"
            },
            {
              "name": "Delphine",
              "values": {
                "book": "Nightjar Road",
                "poll": "January 2027",
                "why": "I'd like to hear Maud read the letters aloud."
              },
              "added": "-6d"
            },
            {
              "name": "Marguerite",
              "values": {
                "book": "Orchard of Glass",
                "poll": "January 2027",
                "why": "Cider in January, why not."
              },
              "added": "-1d"
            },
            {
              "name": "Elspeth",
              "values": {
                "book": "Nightjar Road",
                "poll": "January 2027",
                "why": "It's the one I keep thinking about."
              },
              "added": "-2d"
            },
            {
              "name": "Ruth",
              "values": {
                "book": "The Weather in Ardmoor",
                "poll": "January 2027",
                "why": "Weather station diaries: very Hartcombe."
              },
              "added": "-3d"
            }
          ]
        },
        "logDay": "2026-10-14"
      }
    }
  },
  "files": [
    "index.html",
    "privacy.html",
    "app/index.html",
    "app/meeting.html",
    "app/vote.html",
    "app/notes.html",
    "app/shelf.html",
    "app/card.html",
    "app/account.html",
    "styles.css",
    "app.js",
    "kit.css",
    "kit.js",
    "kit-icons.svg",
    "icons.svg",
    "art/lamp-room.svg",
    "art/spines.svg",
    "art/cover-salt-clock.svg",
    "art/cover-ferrymans-almanac.svg",
    "art/cover-lantern-mill.svg",
    "art/cover-glasshouse-winter.svg",
    "art/cover-orchard-of-glass.svg",
    "art/cover-nightjar-road.svg",
    "art/cover-map-of-borrowed-rooms.svg",
    "art/cover-weather-in-ardmoor.svg",
    "site.webmanifest",
    "favicon.svg",
    "og.png",
    "apple-touch-icon.png",
    "icon-192.png",
    "icon-512.png",
    "icon-512-maskable.png"
  ],
  "pages": [
    {
      "path": "index.html",
      "label": "Home",
      "purpose": "The public page: the club, this month's book and meeting, how the app works (reply, vote, notes, check in), the season's books, the January shortlist, where we meet and Ask to join (an email to the host)"
    },
    {
      "path": "app/index.html",
      "label": "Home",
      "purpose": "Signed out, a welcome with Sign in and Ask to join. Signed in: the month's book as a dust jacket with the meeting on its flap, the member's reply card in its pocket with past check-ins stamped, the page they are on as a bookmark ribbon and the pace to finish, this week's question, the vote closing date, the member's latest note and its status, and meetings attended toward a free paperback"
    },
    {
      "path": "app/meeting.html",
      "label": "Meeting",
      "purpose": "This month's meeting: the book, when and where, the host, the discussion questions, where the member is up to (log a page, see the last three), the reply form (coming, maybe or not, and what they bring) and the member's replies"
    },
    {
      "path": "app/vote.html",
      "label": "Vote",
      "purpose": "The January shortlist of four with covers and blurbs, the vote form with a reason, the member's own vote, and how the winner is announced"
    },
    {
      "path": "app/notes.html",
      "label": "Notes",
      "purpose": "Write notes for a meeting (book, rating, thoughts, a line to read out), then follow each note from Received to Read out with the host's reply"
    },
    {
      "path": "app/card.html",
      "label": "Card",
      "purpose": "The member's code for checking in at the door, meetings attended toward a free paperback (every tenth meeting), the reward ready to collect, and the meetings attended"
    },
    {
      "path": "app/shelf.html",
      "label": "Shelf",
      "purpose": "The club's books this year with meeting dates, the member's ratings and notes newest first, and what comes next"
    },
    {
      "path": "app/account.html",
      "label": "Account",
      "purpose": "The member's name, the account block (sign-in, devices, leaving), the club's rules and how to reach the host"
    },
    {
      "path": "privacy.html",
      "label": "Privacy",
      "purpose": "The privacy notice, with blanks the host fills in"
    }
  ],
  "facts": [
    "club name",
    "meeting day, time and venue",
    "host's name and email",
    "phone number",
    "this season's books and meeting dates",
    "the shortlist for the next vote and its closing date",
    "the reward for meetings attended",
    "privacy contact and address"
  ],
  "interview": [
    "What is the club called, and where and when does it meet?",
    "Who hosts, who scans members in at the door, and how many members do you keep to?",
    "Which books are this season's, with their meeting dates, and what was read earlier this year?",
    "What are the four shortlisted books for the next vote, with a line about each, and when does the vote close?",
    "What discussion questions does the host set for this month's book?",
    "What do members get for coming regularly (for example a free paperback every tenth meeting), and who pays for it?",
    "What email and phone should people use, and how long should the privacy notice say you keep members' details and notes?"
  ],
  "customise": {
    "strings": [
      "The Lamplight Readers in the header, footer and titles, with the host Maud Inglethorpe-Sale, Pellow & Daughters Bookshop and 27 Vellum Row, Hartcombe QU3 9GJ: replace every data-pl-fill fact with the club's own, and site.webmanifest.name and the wordmark text on index.html and every app page.",
      "Fill in every highlighted blank on privacy.html with the Site Owner before users sign in (not legal advice: https://pagelemon.com/agents/member-app-legal).",
      "Set up with setup_app (signup invite, the profile field name as the display field, so the host sees first names at the door), then save_app_list for rsvps, votes, thoughts, pages and attendance exactly as memberApp.lists says, with status_options and reply on thoughts.",
      "Meetings live in the meetings list (Lists in the Dashboard, or save_list): book, author, date and time, pages, about the book, the questions for the room (one a line), cover, status and the club rating. Each month set the meeting just held to Read (with its club rating) and the next one to Next: Home, the meeting page, the reply form, the notes and reading forms, the shelf and the public page follow, with no page edits. Exactly one meeting is Next; Later meetings show in the reply form.",
      "The book vote lives in the shortlist list: four books with poll (the month it picks), closes (the closing time) and status Open. Members vote on app/vote.html (the book and poll come from the Open rows). When it closes, count each member's newest vote for the poll in the Dashboard (Apps, Book votes), then set the winner to Chosen and the others to Not chosen, each with its votes: the result card shows on the vote page and Home at once. The page closing is a display: a vote sent late still saves, so count only votes sent before the closing time.",
      "Reading progress: the pages list (book, on_page, line); the book comes from the Next meeting, and the pace on Home from its pages and date.",
      "Check-in at the door: save_app_list for attendance with scan exactly as memberApp.scan says (At the meeting, goal 10, once a day, so once per meeting night; Free paperback redeems 10). The host or a helper with Scan users scans each member's code on their phone. Change the goal and the reward text on app/card.html, app/index.html and index.html together.",
      "Notes: the host sets each note's status (Received, On Maud's list, Read out) and an optional reply in the Dashboard (Apps); members see both on app/notes.html.",
      "Joining is by invitation: the public page asks people to email the host, and the host sends invite_users to the people the club says yes to. Replace hello@lamplightreaders.example.com everywhere with the club's own address.",
      "Club business only: adults aged 18 or older. Never add health or medical questions, never ask for card, bank or ID numbers in the app lists, never create accounts for children or collect their personal data, and never request passwords.",
      "Notes carry read_as (With my name or Without my name): the host reads anonymous notes without the member's name."
    ],
    "colours": "Edit the --c-* and --k-* tokens at the top of styles.css (page, oxblood, bookcloth blue, brass foil, manila for the reply pocket); the dark scheme (a lamplit room) follows the device. Jackets and spines take their colours from each book's cover.",
    "fonts": "Google Fonts: Cormorant Garamond (titles, book names, reading text) and Josefin Sans (labels, dates, buttons), one <link> in every page head and --c-serif / --c-sans in styles.css. If the owner prefers no font service, download both (OFL) into a fonts/ folder and switch to @font-face.",
    "sections": "App pages live under /app on the shared app kit (kit.css, kit.js, kit-icons.svg: never edit those copies) and use the data-pl-view markup. Each app list is a form and a row template: keep the field names and select options together with save_app_list. Update meetings and shortlist through save_list; the pages follow those lists.",
    "images": "art/cover-*.svg are drawn sample covers (400×600) used by the meetings and shortlist lists' cover field: put the real cover in the site and set the field, or keep a drawn one. Each jacket's spine is a blurred wash of the same cover with the title over it, so a real cover gives its own spine colour. art/lamp-room.svg is a spare drawing of the reading lamp. icons.svg holds the app's extra icons (book, pen, ballot, quote, door, shelf)."
  },
  "schemaVersion": 2,
  "updated": "2026-10-21",
  "lists": [
    {
      "name": "meetings",
      "label": "Meetings",
      "pages": [
        "index.html",
        "app/index.html",
        "app/meeting.html",
        "app/notes.html",
        "app/shelf.html"
      ],
      "fields": [
        {
          "name": "label",
          "type": "text",
          "label": "Name in the reply form (day · book)"
        },
        {
          "name": "book",
          "type": "text",
          "label": "Book"
        },
        {
          "name": "author",
          "type": "text",
          "label": "Author"
        },
        {
          "name": "when",
          "type": "date",
          "label": "Date and time"
        },
        {
          "name": "pages",
          "type": "number",
          "label": "Pages"
        },
        {
          "name": "blurb",
          "type": "long_text",
          "label": "About the book"
        },
        {
          "name": "questions",
          "type": "long_text",
          "label": "Questions for the room, one a line"
        },
        {
          "name": "cover",
          "type": "image",
          "label": "Cover"
        },
        {
          "name": "status",
          "type": "text",
          "label": "Status: Next, Read or Later"
        },
        {
          "name": "rating",
          "type": "text",
          "label": "Club rating after the meeting"
        }
      ],
      "items": [
        {
          "slug": "glasshouse-winter",
          "label": "Wed 9 Sep · Glasshouse Winter",
          "book": "Glasshouse Winter",
          "author": "Marit Holtby",
          "when": "2026-09-09T19:30",
          "pages": 288,
          "blurb": "A widowed gardener keeps her late husband's glasshouse going through one hard winter, and her daughter comes home to talk her out of it.",
          "questions": "What does the greenhouse protect, and what does it keep out?\nWas the daughter's choice at the end a surrender?\nWhich winter scene stayed with you?",
          "cover": "art/cover-glasshouse-winter.svg",
          "status": "Read",
          "rating": "3.6"
        },
        {
          "slug": "lantern-mill",
          "label": "Wed 14 Oct · The Lantern Mill",
          "book": "The Lantern Mill",
          "author": "Asa Penhallow",
          "when": "2026-10-14T19:30",
          "pages": 304,
          "blurb": "A mill town told through its ledger: who was paid, who wasn't, and the foreman whose handwriting slowly gives him away.",
          "questions": "The mill ledger is the book's quietest character. What does it know that the town doesn't?\nWhy does the foreman's handwriting change?\nWho is the lantern for?",
          "cover": "art/cover-lantern-mill.svg",
          "status": "Read",
          "rating": "4.1"
        },
        {
          "slug": "salt-clock",
          "label": "Wed 11 Nov · The Salt Clock",
          "book": "The Salt Clock",
          "author": "Ines Harrowgate",
          "when": "2026-11-11T19:30",
          "pages": 312,
          "blurb": "A lighthouse keeper's widow starts timing the tide for the harbour office and finds a logbook in her husband's hand that doesn't match the printed tables. Quiet and exact, and more about who writes things down than about the sea.",
          "questions": "The logbook is written in a careful, neat hand. What does that neatness tell us about the keeper?\nWhy does the widow keep timing the tide after the harbour office has stopped asking her to?\nWhich of the two accounts of the storm would you believe, and why?\nThe novel ends on a page of tide times with nothing written beside them. What did you make of that?",
          "cover": "art/cover-salt-clock.svg",
          "status": "Next"
        },
        {
          "slug": "ferrymans-almanac",
          "label": "Wed 9 Dec · The Ferryman's Almanac",
          "book": "The Ferryman's Almanac",
          "author": "Tobias Wren",
          "when": "2026-12-09T19:30",
          "pages": 276,
          "blurb": "Forty years of a river crossing, written up as an almanac by the ferryman's daughter.",
          "questions": "Whose almanac is it, really: the ferryman's or his daughter's?\nThe river changes course twice. What else in the village changes with it?\nWhich crossing would you have refused to make?\nDid the last entry feel like an ending or a beginning?",
          "cover": "art/cover-ferrymans-almanac.svg",
          "status": "Later"
        },
        {
          "slug": "january",
          "label": "Wed 13 Jan · The vote's winner",
          "book": "January's book: the members' vote",
          "author": "Chosen from the shortlist",
          "when": "2027-01-13T19:30",
          "status": "Later"
        }
      ]
    },
    {
      "name": "shortlist",
      "label": "Book votes",
      "pages": [
        "index.html",
        "app/index.html",
        "app/vote.html"
      ],
      "fields": [
        {
          "name": "title",
          "type": "text",
          "label": "Book"
        },
        {
          "name": "author",
          "type": "text",
          "label": "Author"
        },
        {
          "name": "pages",
          "type": "number",
          "label": "Pages"
        },
        {
          "name": "blurb",
          "type": "long_text",
          "label": "One line about it"
        },
        {
          "name": "cover",
          "type": "image",
          "label": "Cover"
        },
        {
          "name": "poll",
          "type": "text",
          "label": "Which vote (the month it picks)"
        },
        {
          "name": "closes",
          "type": "date",
          "label": "Voting closes"
        },
        {
          "name": "status",
          "type": "text",
          "label": "Status: Open, Chosen or Not chosen"
        },
        {
          "name": "votes",
          "type": "number",
          "label": "Votes (Maud's count, after the close)"
        }
      ],
      "items": [
        {
          "slug": "orchard-of-glass",
          "title": "Orchard of Glass",
          "author": "Sela Brightwater",
          "pages": 264,
          "blurb": "Three sisters inherit a cider orchard and a debt nobody mentioned.",
          "cover": "art/cover-orchard-of-glass.svg",
          "poll": "January 2027",
          "closes": "2026-11-22T23:59",
          "status": "Open"
        },
        {
          "slug": "nightjar-road",
          "title": "Nightjar Road",
          "author": "Hester Quayle",
          "pages": 228,
          "blurb": "Two sisters, one box of letters and a bird-watching society with secrets.",
          "cover": "art/cover-nightjar-road.svg",
          "poll": "January 2027",
          "closes": "2026-11-22T23:59",
          "status": "Open"
        },
        {
          "slug": "map-of-borrowed-rooms",
          "title": "A Map of Borrowed Rooms",
          "author": "Jonah Achterberg",
          "pages": 340,
          "blurb": "A house-sitter maps every home she minds, until one maps her back.",
          "cover": "art/cover-map-of-borrowed-rooms.svg",
          "poll": "January 2027",
          "closes": "2026-11-22T23:59",
          "status": "Open"
        },
        {
          "slug": "weather-in-ardmoor",
          "title": "The Weather in Ardmoor",
          "author": "Ciaran Mallory",
          "pages": 296,
          "blurb": "A village told through a year of a weather station's diaries.",
          "cover": "art/cover-weather-in-ardmoor.svg",
          "poll": "January 2027",
          "closes": "2026-11-22T23:59",
          "status": "Open"
        },
        {
          "slug": "ferrymans-almanac",
          "title": "The Ferryman's Almanac",
          "author": "Tobias Wren",
          "pages": 276,
          "blurb": "Forty years of a river crossing, written up as an almanac.",
          "cover": "art/cover-ferrymans-almanac.svg",
          "poll": "December 2026",
          "closes": "2026-09-20T23:59",
          "status": "Chosen",
          "votes": 9
        },
        {
          "slug": "hollow-weir",
          "title": "Hollow Weir",
          "author": "Ada Fenwick",
          "pages": 242,
          "blurb": "A drowned village comes up in a drought summer.",
          "poll": "December 2026",
          "closes": "2026-09-20T23:59",
          "status": "Not chosen",
          "votes": 4
        },
        {
          "slug": "glass-archive",
          "title": "The Glass Archive",
          "author": "Ruben Ost",
          "pages": 318,
          "blurb": "A photographer's negatives, and the town that wants them back.",
          "poll": "December 2026",
          "closes": "2026-09-20T23:59",
          "status": "Not chosen",
          "votes": 3
        },
        {
          "slug": "small-hours-at-kestle",
          "title": "Small Hours at Kestle",
          "author": "Nia Pryce",
          "pages": 210,
          "blurb": "Night shifts at a seaside care home, told by the cook.",
          "poll": "December 2026",
          "closes": "2026-09-20T23:59",
          "status": "Not chosen",
          "votes": 1
        }
      ]
    }
  ]
}
