{
  "name": "Spotter",
  "slug": "spotter",
  "blocks": ["Pages", "Lists", "Sign-in: users", "Actions: pay, scan"],
  "persona": "local-services",
  "keywords": [
    "personal trainer",
    "coaching app",
    "client app",
    "workout log",
    "weekly check-in",
    "training plan",
    "online coaching",
    "strength coach",
    "fitness coaching",
    "tracker",
    "personal training clients",
    "member sign-in",
    "paid tiers",
    "strength training"
  ],
  "description": "An app template for a personal trainer: clients open today's session from the programme the coach assigns, log every exercise with sets, reps, load in kg and effort, see their top lifts, and send a Sunday check-in the coach answers (Sent, Dara is reading, Answered, with a written reply). Hybrid clients show a gym card at the door, scanned toward 8 gym sessions a month. A public page with two paid plans, seven member screens under /app and a privacy notice with blanks.",
  "audience": [
    "personal trainers",
    "strength coaches",
    "online coaches who write programmes for clients"
  ],
  "category": "Tracker",
  "job": "member-app",
  "categoryId": "tracker",
  "alsoFits": [
    "personal training",
    "online coaching programmes",
    "sports coaching clients",
    "gym class progress logs"
  ],
  "direction": "Chalk line: slate blue, chalk white and highlighter lime, with whiteboard programme cards and a barbell-plate progress ring",
  "mood": [
    "dark",
    "bold",
    "modern"
  ],
  "fonts": [
    "Familjen Grotesk",
    "Kalam"
  ],
  "schemaOrg": "ProfessionalService",
  "memberApp": {
    "path": "/app",
    "lists": [
      {
        "list": "programme",
        "label": "This week's programme",
        "by": "owner",
        "fields": [
          {
            "name": "day",
            "type": "choice",
            "label": "Day",
            "required": true,
            "options": [
              "Monday",
              "Tuesday",
              "Wednesday",
              "Thursday",
              "Friday",
              "Saturday",
              "Sunday"
            ]
          },
          {
            "name": "session",
            "type": "text",
            "label": "Session",
            "required": true
          },
          {
            "name": "ex1",
            "type": "choice",
            "label": "Main lift",
            "required": true,
            "options": [
              "Back squat",
              "Front squat",
              "Deadlift",
              "Bench press",
              "Overhead press",
              "Farmer carries",
              "Other"
            ]
          },
          {
            "name": "ex1_sets",
            "type": "number",
            "label": "Sets",
            "required": true
          },
          {
            "name": "ex1_reps",
            "type": "number",
            "label": "Reps",
            "required": true
          },
          {
            "name": "ex1_kg",
            "type": "number",
            "label": "kg"
          },
          {
            "name": "ex2",
            "type": "text",
            "label": "Exercise 2"
          },
          {
            "name": "ex2_sets",
            "type": "number",
            "label": "Sets"
          },
          {
            "name": "ex2_reps",
            "type": "number",
            "label": "Reps"
          },
          {
            "name": "ex2_kg",
            "type": "number",
            "label": "kg"
          },
          {
            "name": "ex3",
            "type": "text",
            "label": "Exercise 3"
          },
          {
            "name": "ex3_sets",
            "type": "number",
            "label": "Sets"
          },
          {
            "name": "ex3_reps",
            "type": "number",
            "label": "Reps"
          },
          {
            "name": "ex3_kg",
            "type": "number",
            "label": "kg"
          },
          {
            "name": "ex4",
            "type": "text",
            "label": "Exercise 4"
          },
          {
            "name": "ex4_sets",
            "type": "number",
            "label": "Sets"
          },
          {
            "name": "ex4_reps",
            "type": "number",
            "label": "Reps"
          },
          {
            "name": "ex4_kg",
            "type": "number",
            "label": "kg"
          },
          {
            "name": "ex5",
            "type": "text",
            "label": "Exercise 5"
          },
          {
            "name": "ex5_sets",
            "type": "number",
            "label": "Sets"
          },
          {
            "name": "ex5_reps",
            "type": "number",
            "label": "Reps"
          },
          {
            "name": "ex5_secs",
            "type": "number",
            "label": "Seconds"
          },
          {
            "name": "ex5_kg",
            "type": "number",
            "label": "kg"
          },
          {
            "name": "target",
            "type": "text",
            "label": "Dara's note"
          }
        ]
      },
      {
        "list": "workouts",
        "label": "Training log",
        "by": "member",
        "fields": [
          {
            "name": "date",
            "type": "date",
            "label": "Date",
            "required": true
          },
          {
            "name": "session",
            "type": "text",
            "label": "Session",
            "required": true
          },
          {
            "name": "ex1",
            "type": "choice",
            "label": "Main lift",
            "required": true,
            "options": [
              "Back squat",
              "Front squat",
              "Deadlift",
              "Bench press",
              "Overhead press",
              "Farmer carries",
              "Other"
            ]
          },
          {
            "name": "ex1_sets",
            "type": "number",
            "label": "Sets",
            "required": true
          },
          {
            "name": "ex1_reps",
            "type": "number",
            "label": "Reps",
            "required": true
          },
          {
            "name": "ex1_kg",
            "type": "number",
            "label": "kg"
          },
          {
            "name": "ex2",
            "type": "text",
            "label": "Exercise 2"
          },
          {
            "name": "ex2_sets",
            "type": "number",
            "label": "Sets"
          },
          {
            "name": "ex2_reps",
            "type": "number",
            "label": "Reps"
          },
          {
            "name": "ex2_kg",
            "type": "number",
            "label": "kg"
          },
          {
            "name": "ex3",
            "type": "text",
            "label": "Exercise 3"
          },
          {
            "name": "ex3_sets",
            "type": "number",
            "label": "Sets"
          },
          {
            "name": "ex3_reps",
            "type": "number",
            "label": "Reps"
          },
          {
            "name": "ex3_kg",
            "type": "number",
            "label": "kg"
          },
          {
            "name": "ex4",
            "type": "text",
            "label": "Exercise 4"
          },
          {
            "name": "ex4_sets",
            "type": "number",
            "label": "Sets"
          },
          {
            "name": "ex4_reps",
            "type": "number",
            "label": "Reps"
          },
          {
            "name": "ex4_kg",
            "type": "number",
            "label": "kg"
          },
          {
            "name": "ex5",
            "type": "text",
            "label": "Exercise 5"
          },
          {
            "name": "ex5_sets",
            "type": "number",
            "label": "Sets"
          },
          {
            "name": "ex5_reps",
            "type": "number",
            "label": "Reps"
          },
          {
            "name": "ex5_secs",
            "type": "number",
            "label": "Seconds"
          },
          {
            "name": "ex5_kg",
            "type": "number",
            "label": "kg"
          },
          {
            "name": "effort",
            "type": "choice",
            "label": "Effort (1 to 10)",
            "required": true,
            "options": [
              "1",
              "2",
              "3",
              "4",
              "5",
              "6",
              "7",
              "8",
              "9",
              "10"
            ]
          },
          {
            "name": "memo",
            "type": "long_text",
            "label": "Note for Dara"
          }
        ]
      },
      {
        "list": "checkins",
        "label": "Weekly check-ins",
        "by": "member",
        "fields": [
          {
            "name": "week",
            "type": "date",
            "label": "Week ending",
            "required": true
          },
          {
            "name": "sessions_done",
            "type": "number",
            "label": "Sessions done",
            "required": true
          },
          {
            "name": "hardest",
            "type": "text",
            "label": "Hardest session"
          },
          {
            "name": "win",
            "type": "text",
            "label": "One win this week"
          },
          {
            "name": "next_week",
            "type": "long_text",
            "label": "What should we change?"
          }
        ],
        "status_options": [
          "Sent",
          "Dara is reading",
          "Answered"
        ],
        "reply": true
      },
      {
        "list": "visits",
        "label": "Gym visits",
        "by": "owner",
        "fields": [
          {
            "name": "item",
            "type": "text",
            "label": "Visit",
            "required": true
          }
        ]
      }
    ],
    "plans": [
      {
        "plan": "online",
        "name": "Online coaching",
        "paid": true,
        "price": {
          "amount": 7900,
          "currency": "gbp",
          "interval": "month"
        }
      },
      {
        "plan": "hybrid",
        "name": "Hybrid",
        "paid": true,
        "price": {
          "amount": 14900,
          "currency": "gbp",
          "interval": "month"
        }
      }
    ],
    "demo": {
      "member": {
        "name": "Tomasz Kowalczyk",
        "email": "tomasz.kowalczyk@example.com",
        "profile": {
          "name": "Tomasz"
        }
      },
      "plans": [
        "hybrid"
      ],
      "rows": {
        "programme": [
          {
            "day": "Monday",
            "session": "Lower A: squat focus",
            "ex1": "Back squat",
            "ex1_sets": 5,
            "ex1_reps": 5,
            "ex1_kg": 85,
            "ex2": "Romanian deadlift",
            "ex2_sets": 3,
            "ex2_reps": 8,
            "ex2_kg": 70,
            "ex3": "Walking lunges",
            "ex3_sets": 3,
            "ex3_reps": 10,
            "ex3_kg": 16,
            "ex4": "Hip thrust",
            "ex4_sets": 3,
            "ex4_reps": 10,
            "ex4_kg": 80,
            "target": "Last squat set at effort 8. Move to 87.5 kg when all five sets are clean."
          },
          {
            "day": "Wednesday",
            "session": "Upper push and pull",
            "ex1": "Bench press",
            "ex1_sets": 4,
            "ex1_reps": 6,
            "ex1_kg": 65,
            "ex2": "Barbell row",
            "ex2_sets": 4,
            "ex2_reps": 8,
            "ex2_kg": 57.5,
            "ex3": "Overhead press",
            "ex3_sets": 3,
            "ex3_reps": 8,
            "ex3_kg": 40,
            "ex4": "Face pulls",
            "ex4_sets": 3,
            "ex4_reps": 15,
            "ex4_kg": 15,
            "target": "Keep rest to 90 seconds on the bench."
          },
          {
            "day": "Friday",
            "session": "Lower B: deadlift focus",
            "ex1": "Deadlift",
            "ex1_sets": 4,
            "ex1_reps": 4,
            "ex1_kg": 110,
            "ex2": "Front squat",
            "ex2_sets": 3,
            "ex2_reps": 6,
            "ex2_kg": 62.5,
            "ex3": "Hip thrust",
            "ex3_sets": 3,
            "ex3_reps": 10,
            "ex3_kg": 85,
            "ex4": "Back extension",
            "ex4_sets": 3,
            "ex4_reps": 12,
            "ex4_kg": 10,
            "target": "Stop the deadlift if the bar slows. Back extensions slow on the way down."
          },
          {
            "day": "Saturday",
            "session": "Carries and conditioning",
            "ex1": "Farmer carries",
            "ex1_sets": 5,
            "ex1_reps": 1,
            "ex1_kg": 34,
            "ex2": "Kettlebell swings",
            "ex2_sets": 5,
            "ex2_reps": 15,
            "ex2_kg": 24,
            "ex3": "Goblet squat",
            "ex3_sets": 3,
            "ex3_reps": 12,
            "ex3_kg": 20,
            "ex4": "Dead bug",
            "ex4_sets": 3,
            "ex4_reps": 10,
            "ex5": "Plank",
            "ex5_sets": 3,
            "ex5_secs": 45,
            "target": "One length of the floor per carry. Easy pace on the swings."
          }
        ],
        "workouts": [
          {
            "date": "0w:mon",
            "session": "Lower A: squat focus",
            "ex1": "Back squat",
            "ex1_sets": 5,
            "ex1_reps": 5,
            "ex1_kg": 85,
            "ex2": "Romanian deadlift",
            "ex2_sets": 3,
            "ex2_reps": 8,
            "ex2_kg": 70,
            "ex3": "Walking lunges",
            "ex3_sets": 3,
            "ex3_reps": 10,
            "ex3_kg": 16,
            "ex4": "Hip thrust",
            "ex4_sets": 3,
            "ex4_reps": 10,
            "ex4_kg": 80,
            "effort": "8",
            "memo": "First week at 85. Depth good, fifth set slowed in the middle.",
            "_added": "0w:mon"
          },
          {
            "date": "-1w:sat",
            "session": "Carries and conditioning",
            "ex1": "Farmer carries",
            "ex1_sets": 5,
            "ex1_reps": 1,
            "ex1_kg": 32,
            "ex2": "Kettlebell swings",
            "ex2_sets": 5,
            "ex2_reps": 15,
            "ex2_kg": 24,
            "ex3": "Goblet squat",
            "ex3_sets": 3,
            "ex3_reps": 12,
            "ex3_kg": 20,
            "ex4": "Dead bug",
            "ex4_sets": 3,
            "ex4_reps": 10,
            "ex5": "Plank",
            "ex5_sets": 3,
            "ex5_secs": 45,
            "effort": "7",
            "memo": "Grip went before my legs did.",
            "_added": "-1w:sat"
          },
          {
            "date": "-1w:fri",
            "session": "Lower B: deadlift focus",
            "ex1": "Deadlift",
            "ex1_sets": 4,
            "ex1_reps": 4,
            "ex1_kg": 105,
            "ex2": "Front squat",
            "ex2_sets": 3,
            "ex2_reps": 6,
            "ex2_kg": 60,
            "ex3": "Hip thrust",
            "ex3_sets": 3,
            "ex3_reps": 10,
            "ex3_kg": 82.5,
            "ex4": "Back extension",
            "ex4_sets": 3,
            "ex4_reps": 12,
            "ex4_kg": 10,
            "effort": "8",
            "memo": "Fourth set slower off the floor than the first.",
            "_added": "-1w:fri"
          },
          {
            "date": "-1w:wed",
            "session": "Upper push and pull",
            "ex1": "Bench press",
            "ex1_sets": 4,
            "ex1_reps": 6,
            "ex1_kg": 62.5,
            "ex2": "Barbell row",
            "ex2_sets": 4,
            "ex2_reps": 8,
            "ex2_kg": 55,
            "ex3": "Overhead press",
            "ex3_sets": 3,
            "ex3_reps": 8,
            "ex3_kg": 40,
            "ex4": "Face pulls",
            "ex4_sets": 3,
            "ex4_reps": 15,
            "ex4_kg": 15,
            "effort": "7",
            "_added": "-1w:wed"
          },
          {
            "date": "-1w:mon",
            "session": "Lower A: squat focus",
            "ex1": "Back squat",
            "ex1_sets": 5,
            "ex1_reps": 5,
            "ex1_kg": 82.5,
            "ex2": "Romanian deadlift",
            "ex2_sets": 3,
            "ex2_reps": 8,
            "ex2_kg": 67.5,
            "ex3": "Walking lunges",
            "ex3_sets": 3,
            "ex3_reps": 10,
            "ex3_kg": 16,
            "ex4": "Hip thrust",
            "ex4_sets": 3,
            "ex4_reps": 10,
            "ex4_kg": 80,
            "effort": "8",
            "memo": "All five sets clean.",
            "_added": "-1w:mon"
          },
          {
            "date": "-2w:sat",
            "session": "Carries and conditioning",
            "ex1": "Farmer carries",
            "ex1_sets": 5,
            "ex1_reps": 1,
            "ex1_kg": 30,
            "ex2": "Kettlebell swings",
            "ex2_sets": 5,
            "ex2_reps": 15,
            "ex2_kg": 24,
            "ex3": "Goblet squat",
            "ex3_sets": 3,
            "ex3_reps": 12,
            "ex3_kg": 20,
            "ex4": "Dead bug",
            "ex4_sets": 3,
            "ex4_reps": 10,
            "ex5": "Plank",
            "ex5_sets": 3,
            "ex5_secs": 45,
            "effort": "7",
            "_added": "-2w:sat"
          },
          {
            "date": "-2w:fri",
            "session": "Lower B: deadlift focus",
            "ex1": "Deadlift",
            "ex1_sets": 4,
            "ex1_reps": 4,
            "ex1_kg": 102.5,
            "ex2": "Front squat",
            "ex2_sets": 3,
            "ex2_reps": 6,
            "ex2_kg": 60,
            "ex3": "Hip thrust",
            "ex3_sets": 3,
            "ex3_reps": 10,
            "ex3_kg": 82.5,
            "ex4": "Back extension",
            "ex4_sets": 3,
            "ex4_reps": 12,
            "ex4_kg": 10,
            "effort": "8",
            "_added": "-2w:fri"
          },
          {
            "date": "-2w:wed",
            "session": "Upper push and pull",
            "ex1": "Bench press",
            "ex1_sets": 4,
            "ex1_reps": 6,
            "ex1_kg": 62.5,
            "ex2": "Barbell row",
            "ex2_sets": 4,
            "ex2_reps": 8,
            "ex2_kg": 55,
            "ex3": "Overhead press",
            "ex3_sets": 3,
            "ex3_reps": 8,
            "ex3_kg": 40,
            "ex4": "Face pulls",
            "ex4_sets": 3,
            "ex4_reps": 15,
            "ex4_kg": 15,
            "effort": "8",
            "memo": "Last set heavy from the start.",
            "_added": "-2w:wed"
          },
          {
            "date": "-2w:mon",
            "session": "Lower A: squat focus",
            "ex1": "Back squat",
            "ex1_sets": 5,
            "ex1_reps": 5,
            "ex1_kg": 82.5,
            "ex2": "Romanian deadlift",
            "ex2_sets": 3,
            "ex2_reps": 8,
            "ex2_kg": 67.5,
            "ex3": "Walking lunges",
            "ex3_sets": 3,
            "ex3_reps": 10,
            "ex3_kg": 16,
            "ex4": "Hip thrust",
            "ex4_sets": 3,
            "ex4_reps": 10,
            "ex4_kg": 80,
            "effort": "9",
            "memo": "Fifth set ground out. Stayed at 82.5.",
            "_added": "-2w:mon"
          },
          {
            "date": "-3w:fri",
            "session": "Lower B: deadlift focus",
            "ex1": "Deadlift",
            "ex1_sets": 4,
            "ex1_reps": 4,
            "ex1_kg": 100,
            "ex2": "Front squat",
            "ex2_sets": 3,
            "ex2_reps": 6,
            "ex2_kg": 60,
            "ex3": "Hip thrust",
            "ex3_sets": 3,
            "ex3_reps": 10,
            "ex3_kg": 82.5,
            "ex4": "Back extension",
            "ex4_sets": 3,
            "ex4_reps": 12,
            "ex4_kg": 10,
            "effort": "7",
            "_added": "-3w:fri"
          },
          {
            "date": "-3w:wed",
            "session": "Upper push and pull",
            "ex1": "Bench press",
            "ex1_sets": 4,
            "ex1_reps": 6,
            "ex1_kg": 60,
            "ex2": "Barbell row",
            "ex2_sets": 4,
            "ex2_reps": 8,
            "ex2_kg": 55,
            "ex3": "Overhead press",
            "ex3_sets": 3,
            "ex3_reps": 8,
            "ex3_kg": 40,
            "ex4": "Face pulls",
            "ex4_sets": 3,
            "ex4_reps": 15,
            "ex4_kg": 15,
            "effort": "7",
            "_added": "-3w:wed"
          },
          {
            "date": "-3w:mon",
            "session": "Lower A: squat focus",
            "ex1": "Back squat",
            "ex1_sets": 5,
            "ex1_reps": 5,
            "ex1_kg": 80,
            "ex2": "Romanian deadlift",
            "ex2_sets": 3,
            "ex2_reps": 8,
            "ex2_kg": 65,
            "ex3": "Walking lunges",
            "ex3_sets": 3,
            "ex3_reps": 10,
            "ex3_kg": 16,
            "ex4": "Hip thrust",
            "ex4_sets": 3,
            "ex4_reps": 10,
            "ex4_kg": 80,
            "effort": "8",
            "_added": "-3w:mon"
          }
        ],
        "checkins": [
          {
            "week": "-1w:sun",
            "sessions_done": 4,
            "hardest": "Deadlift at 105 kg, fourth set",
            "win": "Four sessions, and all five squat sets clean at 82.5",
            "next_week": "I can do Saturday mornings at the gym from now on.",
            "_added": "-1w:sun",
            "_status": "Answered",
            "_reply": "Great week. Squat goes to 85 for 5×5 and bench to 65; Saturday mornings are yours for carries from now on."
          },
          {
            "week": "-2w:sun",
            "sessions_done": 4,
            "hardest": "Back squat at 82.5 kg, fifth set",
            "win": "First week with all four sessions",
            "next_week": "Shorter rest on the accessory work, so sessions finish on time.",
            "_added": "-2w:sun",
            "_status": "Answered",
            "_reply": "Good week. Stay at 82.5 on the squat until all five sets are clean, then 85. Accessories on 60 seconds rest; main lifts keep their 2 to 3 minutes."
          },
          {
            "week": "-3w:sun",
            "sessions_done": 3,
            "hardest": "Bench press at 60 kg",
            "win": "Hit every warm-up set on time",
            "next_week": "Away Thursday for work.",
            "_added": "-3w:sun",
            "_status": "Answered",
            "_reply": "Three is fine with travel. Bench goes to 62.5 next week; deadlift to 102.5."
          }
        ],
        "visits": [
          {
            "item": "Gym session",
            "_added": "0w:mon"
          },
          {
            "item": "Gym session",
            "_added": "-1w:sat"
          },
          {
            "item": "Gym session",
            "_added": "-1w:fri"
          },
          {
            "item": "Gym session",
            "_added": "-1w:wed"
          },
          {
            "item": "Gym session",
            "_added": "-1w:mon"
          }
        ]
      },
      "staff": {
        "members": [
          {
            "name": "Tomasz",
            "plan": "hybrid",
            "counts": {
              "Gym session": 5
            },
            "since": "2026-03-09"
          },
          {
            "name": "Priya",
            "plan": "hybrid",
            "counts": {
              "Gym session": 7
            },
            "since": "2026-01-20"
          },
          {
            "name": "Callum",
            "plan": "hybrid",
            "counts": {
              "Gym session": 2
            },
            "since": "2025-09-15"
          },
          {
            "name": "Ines",
            "plan": "hybrid",
            "counts": {
              "Gym session": 4
            },
            "since": "2026-06-02"
          },
          {
            "name": "Wen",
            "plan": "online",
            "counts": {},
            "since": "2026-08-11"
          }
        ],
        "log": [
          {
            "name": "Priya",
            "action": "Gym session",
            "at": "08:05",
            "by": "Dara"
          },
          {
            "name": "Ines",
            "action": "Gym session",
            "at": "08:40",
            "by": "Dara"
          },
          {
            "name": "Callum",
            "action": "Gym session",
            "at": "18:10",
            "by": "Dara"
          }
        ]
      }
    },
    "setup": {
      "signup": "invite",
      "profile_fields": [
        {
          "name": "name",
          "type": "text",
          "label": "First name"
        }
      ],
      "display_field": "name"
    },
    "scan": [
      {
        "list": "visits",
        "actions": [
          {
            "label": "Gym session",
            "values": {
              "item": "Gym session"
            },
            "daily_limit": 1
          }
        ]
      }
    ]
  },
  "files": [
    "index.html",
    "app/index.html",
    "app/week.html",
    "app/log.html",
    "app/lifts.html",
    "app/checkin.html",
    "app/card.html",
    "app/account.html",
    "privacy.html",
    "styles.css",
    "app.js",
    "kit.css",
    "kit.js",
    "kit-icons.svg",
    "icons.svg",
    "site.webmanifest",
    "favicon.svg",
    "art/welcome-floor.svg",
    "art/coach-board.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: Dara, how a coaching week works in the app, the two plans with prices, where Anvil Works is and a link to sign in"
    },
    {
      "path": "app/index.html",
      "label": "Today",
      "purpose": "Signed out: the welcome and sign-in. Signed in: the next session from the programme with its target and Log button, this week's counts and streak, quick actions, Dara's latest reply, gym sessions this month for Hybrid and the last exercises logged"
    },
    {
      "path": "app/week.html",
      "label": "Week",
      "purpose": "This week's programme from Dara: each session by day with the exercises and target, today's marked, each with a Log button"
    },
    {
      "path": "app/log.html",
      "label": "Log",
      "purpose": "Log an exercise (date, session, exercise, sets, reps, load, effort, note), totals by week and everything logged newest first"
    },
    {
      "path": "app/lifts.html",
      "label": "Lifts",
      "purpose": "One card per exercise: the top load, how many times logged and the average effort, with the rule for adding weight"
    },
    {
      "path": "app/checkin.html",
      "label": "Check-in",
      "purpose": "The Sunday check-in form and every check-in with its status (Sent, Dara is reading, Answered) and Dara's reply"
    },
    {
      "path": "app/card.html",
      "label": "Gym card",
      "purpose": "Hybrid: the code to show at the door, gym sessions this month out of 8, visits and floor hours; Online and new clients see what Hybrid adds"
    },
    {
      "path": "app/account.html",
      "label": "Account",
      "purpose": "The plan (or the two plan cards with join buttons for a client with no plan yet), the account block (billing, devices, leaving) and help"
    },
    {
      "path": "privacy.html",
      "label": "Privacy",
      "purpose": "The privacy notice, with blanks the Site Owner fills in"
    }
  ],
  "facts": [
    "business name",
    "coach's name",
    "gym address",
    "contact email",
    "phone",
    "plan names and monthly prices",
    "what Hybrid includes",
    "privacy contact and address"
  ],
  "interview": [
    "What is your coaching business called, and where do you train clients in person?",
    "What do you coach (strength, sports, general fitness), and who are your clients?",
    "What do your two plans cost a month, and what does each one include?",
    "How do you invite clients, and which email address should they sign in with?",
    "How many sessions a week do you usually programme for a client?",
    "What address and privacy contact should the privacy notice show?"
  ],
  "customise": {
    "strings": [
      "Dara Whitlock Coaching, Dara Whitlock, Anvil Works, 18 Forge Street, Ketterby QS4 6DN, 01632 960 843 and coach@darawhitlock.example.com in the header, footer, titles, JSON-LD and copy; replace every data-pl-fill fact with the owner's own. Replace the business name in site.webmanifest.name too; keep short_name as Spotter unless the owner chooses another app name.",
      "Fill in every highlighted blank on privacy.html with the Site Owner before clients use the site (not legal advice: https://pagelemon.com/agents/member-app-legal)",
      "Make the programme (by owner), workouts, checkins (with its status_options and reply on) and visits lists with save_app_list exactly as memberApp.lists says; change fields there and in the forms and rows on the app pages together. Change the exercise options in the list and in the select on app/log.html together.",
      "Dara answers check-ins in the Dashboard (Apps, the checkins list): set the status to Dara is reading, then Answered with a written reply; the client sees both in the app and gets an email when they change. The programme rows are assigned to each client in the Dashboard, one row per session.",
      "Gym visits: save_app_list for visits with scan exactly as memberApp.scan says (Gym session, one a day). Dara, or staff with Scan members, scans the Hybrid client's code at the door. The 8 a month on app/index.html, app/card.html and the public page is the plan's allowance shown to clients: change it there together (the dots on the pages are 8 items).",
      "Strength and training only: never add body measurement, body weight, sleep, diet, calorie, injury, health or mood fields or wording, and never ask clients for photos of bodies, card, bank, ID or tax numbers, or passwords. Clients must be adults.",
      "Replace the two plan prices with save_plan and on index.html and app/account.html together (online £79 a month, hybrid £149 a month)",
      "The programme list holds only the current week. Delete the client's previous programme rows before assigning the next week; retain history in workouts."
    ],
    "colours": "Edit the :root tokens at the top of styles.css. The chalk line is dark by design; the prefers-color-scheme block only asks the browser for dark form controls",
    "fonts": "Google Fonts: Familjen Grotesk (headings, text and numbers) and Kalam (Dara's handwritten notes and replies), one <link> in every page head and --k-font / --s-hand in styles.css. If the owner prefers no font service, download both (OFL) into a fonts/ folder and switch to @font-face.",
    "sections": "Member pages live under /app on the shared app kit (kit.css, kit.js, kit-icons.svg; never edit those copies; node scripts/sync-app-kit.mjs spotter) with the data-pl-view markup. setup_app with signup invite and the first-name profile field (staff see it when they scan), then save_app_list for programme, workouts, checkins and visits (with scan), then save_plan for online (£79 a month) and hybrid (£149 a month). The plan cards with join buttons sit inside data-pl-if=\"no-plan\"; the gym card inside plan:hybrid. app.js picks the next session from the programme and draws the month's gym dots.",
    "images": "art/welcome-floor.svg is the welcome picture (a training notebook open at Friday's session) and art/coach-board.svg the open notebook of sessions and best lifts on the public page: keep them as drawings or replace them with photos of your own floor and notebook, never of people's bodies. icons.svg holds five icons the app kit doesn't have (dumbbell, chart, chat, flame, door). favicon.svg is the plate mark; the PNG icons are made from it."
  },
  "schemaVersion": 2,
  "updated": "2026-10-21"
}
