{
  "name": "Desk",
  "slug": "desk",
  "blocks": ["Pages", "Lists", "Sign-in: users", "Actions: pay, scan"],
  "persona": "local-services",
  "keywords": [
    "coworking",
    "coworking space",
    "desk booking",
    "hot desk",
    "day pass",
    "meeting room booking",
    "memberships",
    "shared office",
    "check-in",
    "workspace",
    "QR check-in",
    "office membership",
    "members area",
    "flexible office"
  ],
  "description": "An app template for a coworking space: members check in at the door by showing a code the host scans, see their desk days this month, ask for a meeting room the host confirms, send front-desk requests (guest passes, parcels, lockers) and pick a plan. A public page with the day pass, six member screens under /app and a privacy notice with blanks.",
  "audience": [
    "coworking spaces and hot-desk clubs",
    "shared offices with meeting rooms",
    "flexible workspaces run by a host"
  ],
  "category": "Membership",
  "job": "member-app",
  "categoryId": "membership",
  "alsoFits": [
    "shared office",
    "hot desk rental",
    "meeting room hire",
    "flexible office",
    "members' lounge",
    "day pass sales"
  ],
  "direction": "Printworks ink black and paper, magenta and cyan accents from letterpress, real photos of the floor and both rooms, a membership card with a days-this-month meter",
  "mood": [
    "light",
    "bold",
    "modern"
  ],
  "fonts": [
    "Syne",
    "Azeret Mono"
  ],
  "memberApp": {
    "path": "/app",
    "setup": {
      "signup": "open",
      "profile_fields": [
        {
          "name": "name",
          "type": "text",
          "label": "Your name",
          "required": true
        },
        {
          "name": "company",
          "type": "text",
          "label": "Company or project"
        }
      ],
      "display_field": "name"
    },
    "plans": [
      {
        "plan": "visitor",
        "name": "Visitor",
        "free": true
      },
      {
        "plan": "flex",
        "name": "Flex",
        "paid": true,
        "price": {
          "amount": 9500,
          "currency": "gbp",
          "interval": "month"
        }
      },
      {
        "plan": "resident",
        "name": "Resident",
        "paid": true,
        "price": {
          "amount": 21000,
          "currency": "gbp",
          "interval": "month"
        }
      }
    ],
    "lists": [
      {
        "list": "checkins",
        "label": "Day check-ins",
        "by": "owner",
        "fields": [
          {
            "name": "visit",
            "type": "text",
            "label": "Visit",
            "required": true
          }
        ]
      },
      {
        "list": "bookings",
        "label": "Meeting room requests",
        "by": "member",
        "status_options": [
          "Requested",
          "Confirmed",
          "Declined"
        ],
        "reply": true,
        "fields": [
          {
            "name": "room",
            "type": "choice",
            "label": "Room",
            "required": true,
            "options": [
              "The Snug",
              "The Long Room"
            ]
          },
          {
            "name": "date",
            "type": "date",
            "label": "Date",
            "required": true
          },
          {
            "name": "start",
            "type": "choice",
            "label": "Start",
            "required": true,
            "options": [
              "09:00",
              "10:00",
              "11:00",
              "12:00",
              "13:00",
              "14:00",
              "15:00",
              "16:00"
            ]
          },
          {
            "name": "length",
            "type": "choice",
            "label": "How long",
            "required": true,
            "options": [
              "1 hour",
              "2 hours",
              "Half day (4 hours)"
            ]
          },
          {
            "name": "purpose",
            "type": "text",
            "label": "What it's for",
            "required": true
          },
          {
            "name": "guests",
            "type": "number",
            "label": "Guests from outside"
          }
        ]
      },
      {
        "list": "requests",
        "label": "Requests to the front desk",
        "by": "member",
        "status_options": [
          "Received",
          "In hand",
          "Done"
        ],
        "reply": true,
        "fields": [
          {
            "name": "kind",
            "type": "choice",
            "label": "What is it about?",
            "required": true,
            "options": [
              "Guest pass",
              "Post and parcels",
              "Locker",
              "Printing",
              "Something's broken",
              "Change my plan",
              "Cancel or move a room"
            ]
          },
          {
            "name": "date",
            "type": "date",
            "label": "Date",
            "required": true
          },
          {
            "name": "details",
            "type": "long_text",
            "label": "Details",
            "required": true
          }
        ]
      }
    ],
    "scan": [
      {
        "list": "checkins",
        "actions": [
          {
            "label": "Day check-in",
            "values": {
              "visit": "Desk day"
            },
            "daily_limit": 1
          }
        ]
      }
    ],
    "demo": {
      "member": {
        "name": "Fergus Brodie",
        "email": "fergus.brodie@example.com",
        "profile": {
          "name": "Fergus Brodie",
          "company": "Brodie Studio"
        }
      },
      "plans": [
        "flex"
      ],
      "scan": {
        "Day check-in": 23
      },
      "rows": {
        "checkins": [
          {
            "visit": "Desk day",
            "_added": "-1d"
          },
          {
            "visit": "Desk day",
            "_added": "-2d"
          },
          {
            "visit": "Desk day",
            "_added": "-1w:thu"
          },
          {
            "visit": "Desk day",
            "_added": "-1w:tue"
          },
          {
            "visit": "Desk day",
            "_added": "-1w:mon"
          }
        ],
        "bookings": [
          {
            "room": "The Snug",
            "date": "+1w:mon",
            "start": "10:00",
            "length": "2 hours",
            "purpose": "Client review with Mrs Adeyemi",
            "guests": 1,
            "_added": "-1d",
            "_status": "Confirmed",
            "_reply": "Booked. Coffee is on the side table; your guest pass is on the door. Nadia"
          },
          {
            "room": "The Long Room",
            "date": "+1w:thu",
            "start": "14:00",
            "length": "Half day (4 hours)",
            "purpose": "Workshop with the Larkspur team",
            "guests": 6,
            "_added": "today",
            "_status": "Requested"
          },
          {
            "room": "The Snug",
            "date": "-1w:tue",
            "start": "09:00",
            "length": "1 hour",
            "purpose": "Interview call",
            "_added": "-2w:fri",
            "_status": "Confirmed",
            "_reply": "All yours. The speakerphone is charged."
          }
        ],
        "requests": [
          {
            "kind": "Guest pass",
            "date": "+1w:mon",
            "details": "Mrs Adeyemi is coming at 10:00 on Monday for the Snug booking. Could you put her name on the door?",
            "_added": "-1d",
            "_status": "Done",
            "_reply": "Done: her pass is at the front desk from 09:45. Nadia"
          },
          {
            "kind": "Post and parcels",
            "date": "-3d",
            "details": "A box from my printer should have arrived on Monday, addressed to Brodie Studio. Is it behind the desk?",
            "_added": "-4d",
            "_status": "Done",
            "_reply": "Found it. It's on the shelf by the kitchen door, collect any time before 19:00."
          },
          {
            "kind": "Something's broken",
            "date": "-2w:wed",
            "details": "The standing desk at the end of row three won't go up. The motor hums but nothing moves.",
            "_added": "-2w:wed",
            "_status": "Done",
            "_reply": "Fixed on Friday by the supplier. Thanks for flagging it."
          }
        ]
      },
      "staff": {
        "members": [
          {
            "name": "Fergus Brodie",
            "counts": {
              "Day check-in": 23
            },
            "plan": "flex",
            "since": "-14w:mon"
          },
          {
            "name": "Amara Okafor",
            "counts": {
              "Day check-in": 61
            },
            "plan": "resident",
            "since": "-30w:tue"
          },
          {
            "name": "Joel Whitcombe",
            "counts": {
              "Day check-in": 12
            },
            "plan": "flex",
            "since": "-6w:wed"
          },
          {
            "name": "Priti Sandhu",
            "counts": {
              "Day check-in": 4
            },
            "plan": "flex",
            "since": "-2w:mon"
          },
          {
            "name": "Tom Haskell",
            "counts": {
              "Day check-in": 38
            },
            "plan": "resident",
            "since": "-20w:thu"
          },
          {
            "name": "Ines Varga",
            "counts": {
              "Day check-in": 1
            },
            "since": "-0w:mon"
          }
        ],
        "log": [
          {
            "name": "Amara Okafor",
            "action": "Day check-in",
            "at": "08:12",
            "by": "Nadia"
          },
          {
            "name": "Tom Haskell",
            "action": "Day check-in",
            "at": "08:40",
            "by": "Nadia"
          },
          {
            "name": "Joel Whitcombe",
            "action": "Day check-in",
            "at": "09:05",
            "by": "Nadia"
          },
          {
            "name": "Ines Varga",
            "action": "Day check-in",
            "at": "09:31",
            "by": "Owen"
          }
        ],
        "queue": [
          {
            "name": "Joel Whitcombe",
            "values": {
              "room": "The Long Room",
              "date": "+1w:tue",
              "start": "11:00",
              "length": "2 hours",
              "purpose": "Board meeting"
            },
            "status": "Requested"
          },
          {
            "name": "Priti Sandhu",
            "values": {
              "room": "The Snug",
              "date": "+1w:wed",
              "start": "15:00",
              "length": "1 hour",
              "purpose": "Investor call"
            },
            "status": "Requested"
          }
        ]
      }
    }
  },
  "pages": [
    {
      "path": "index.html",
      "label": "Home",
      "purpose": "The public page: the floor, the three plans with prices, the £18 day pass (payment slot), the two meeting rooms, how check-in works and the join link"
    },
    {
      "path": "app/index.html",
      "label": "Home (app)",
      "purpose": "Signed out: the welcome and join. Signed in: the membership card with desk days this month against the plan, Show my pass, the next room booking with its status, the open front-desk request and quick actions"
    },
    {
      "path": "app/pass.html",
      "label": "Pass",
      "purpose": "The member's code the host scans at the door (one check-in a day), wallet buttons where on, opening hours, wifi and house rules"
    },
    {
      "path": "app/rooms.html",
      "label": "Rooms",
      "purpose": "The Snug and The Long Room with photos and what's in them, the room request form (date, start, length, purpose, guests) and the member's bookings with the host's confirmation"
    },
    {
      "path": "app/requests.html",
      "label": "Front desk",
      "purpose": "Guest passes, parcels, lockers, printing and faults: the request form and the member's requests with status and the host's reply"
    },
    {
      "path": "app/plan.html",
      "label": "Plan",
      "purpose": "The member's plan and what it includes, the three plans with join buttons, and how renewal and cancelling work"
    },
    {
      "path": "app/account.html",
      "label": "Account",
      "purpose": "The account block (email, profile, plan, billing, devices, leaving)"
    },
    {
      "path": "privacy.html",
      "label": "Privacy",
      "purpose": "The privacy notice, with highlighted blanks the owner fills in"
    }
  ],
  "facts": [
    "space name",
    "address",
    "phone",
    "email",
    "host name and what the host does",
    "opening hours",
    "number of desks, rooms and booths",
    "day pass price",
    "plan prices and what each plan includes",
    "room names, capacity and hourly prices",
    "privacy contact and legal company name"
  ],
  "interview": [
    "What is the coworking space called, and where is it?",
    "How many desks and meeting rooms do you have, and what are they called?",
    "What do a day pass and each membership cost, and what does each include?",
    "What are your opening hours, and do residents get 24/7 access?",
    "Who runs the front desk and scans members' codes? Each needs a Page Lemon sign-in: invite them as collaborators with only Scan members ticked.",
    "Which email address and phone number should members and visitors use?",
    "What legal company name and privacy contact should the privacy notice show?"
  ],
  "customise": {
    "strings": [
      "The Printworks Desk Club, its address (2nd floor, 11 Compositor Street, Inkermouth QS2 8RL), phone and email in the header, footer, titles and copy; replace every data-pl-fill fact with the owner's own. Also replace site.webmanifest name with the owner's app name and keep short_name short.",
      "Fill in every highlighted blank on privacy.html with the Site Owner before members or visitors use the site (not legal advice: https://pagelemon.com/agents/member-app-legal)",
      "The host checks the Flex allowance of 8 desk days a month at the door: the days-this-month count on app/index.html and app/pass.html counts check-ins this calendar month; no goal is set on the scan action.",
      "Staff scan with their phone's camera: each is a Page Lemon collaborator. Invite them with add_people, role collaborator and permissions [\"scan\"] so they can scan codes but not change the site or see the member list.",
      "Room requests are confirmed by the host in the Dashboard (Apps, Entries: Confirmed or Declined, with a reply); the pages never promise live availability. Rooms, prices (£15 and £35 an hour for non-members; Resident includes 6 room hours a month) are on index.html, app/rooms.html and app/plan.html.",
      "Never add health, payment card, bank or ID fields, and never collect anything about children."
    ],
    "colours": "Edit the --k-brand, --k-hero and --k-gold tokens at the top of styles.css (light and dark); the kit (kit.css) does the rest",
    "fonts": "Google Fonts: Syne (the wide headlines, member name and numbers) and Azeret Mono (text and labels), one <link> in every page head and --k-font-display / --k-font in styles.css. If the owner prefers no font service, download both (OFL) into a fonts/ folder and switch to @font-face.",
    "sections": "Public page: index.html (space, plans, day pass slot, rooms, check-in). Member pages under /app use the data-pl-view markup. setup_app with memberApp.setup (open signup, name and company), save_plan for visitor (free), flex and resident (paid), then save_app_list for checkins with the scan action in memberApp.scan, bookings and requests (status_options and reply on both). The owner's path: the host scans each member's code at the door (Dashboard scan page: confirm, Undo for 10 seconds), sees Today's check-ins and Members, and answers room requests and front-desk requests in Apps, Entries by setting the status and writing a reply the member sees at once. app/index.html Home, app/pass.html the code, app/rooms.html rooms, app/requests.html the front desk, app/plan.html plans, app/account.html the account block. app.js fills the days-this-month meter.",
    "images": "art/print-hall.webp, art/hot-desks.webp, art/the-snug.webp and art/the-long-room.webp are free stock photos from Unsplash and Pexels (PHOTOS.md): replace them with photos of your own floor and rooms, no faces. favicon.svg is the misregistered P mark; the PNG icons and manifest are made from it."
  },
  "files": [
    "index.html",
    "privacy.html",
    "app/index.html",
    "app/pass.html",
    "app/rooms.html",
    "app/requests.html",
    "app/plan.html",
    "app/account.html",
    "styles.css",
    "app.js",
    "kit.css",
    "kit.js",
    "kit-icons.svg",
    "art/print-hall.webp",
    "art/hot-desks.webp",
    "art/the-snug.webp",
    "art/the-long-room.webp",
    "site.webmanifest",
    "favicon.svg",
    "og.png",
    "apple-touch-icon.png",
    "icon-192.png",
    "icon-512.png",
    "icon-512-maskable.png"
  ],
  "schemaVersion": 2,
  "updated": "2026-10-22",
  "slots": [
    {
      "id": "daypass",
      "kind": "payment",
      "page": "index.html",
      "fallback": "mailto"
    }
  ]
}
