{
  "name": "Stride",
  "slug": "stride",
  "blocks": ["Pages", "Lists", "Sign-in: users", "Actions: pay"],
  "persona": "community",
  "keywords": [
    "running club",
    "sports club",
    "club membership",
    "annual subs",
    "fixtures",
    "availability",
    "request to join",
    "members app",
    "athletics club",
    "league",
    "race results",
    "club subscriptions"
  ],
  "description": "An app template for a running club: members ask to join and the committee approves them, then they tell the captain whether they can run each fixture, see whether they're picked (A team, B team or reserve) with the captain's note, follow their race results and personal bests, and pay yearly subs. A public club page with club nights and fixtures, six member screens under /app and a privacy notice with blanks.",
  "audience": [
    "running clubs and athletics clubs with a league",
    "sports clubs that take annual subs and pick teams for fixtures",
    "club secretaries and captains who manage members and results"
  ],
  "category": "Membership & community",
  "job": "member-app",
  "categoryId": "membership",
  "alsoFits": [
    "running club",
    "athletics club",
    "triathlon club",
    "cycling club",
    "rowing club",
    "hockey club"
  ],
  "direction": "Club vest: racing green and amber stripes like a club vest, white race numbers, a running-track lane motif, bold condensed headings, dark scheme",
  "mood": [
    "dark",
    "bold",
    "modern"
  ],
  "fonts": [
    "Saira Extra Condensed",
    "Saira"
  ],
  "memberApp": {
    "path": "/app",
    "setup": {
      "signup": "request",
      "request_note": "Fenella reads every request. Come to two club nights first; the committee says yes within a week.",
      "display_field": "name",
      "profile_fields": [
        {
          "name": "name",
          "type": "text",
          "label": "Your name",
          "required": true
        },
        {
          "name": "usual_pace",
          "type": "choice",
          "label": "Usual pace",
          "options": [
            "Under 8 min/mile",
            "8–9 min/mile",
            "9–10 min/mile",
            "10+ min/mile"
          ]
        },
        {
          "name": "about",
          "type": "long_text",
          "label": "Races you're aiming for"
        }
      ]
    },
    "plans": [
      {
        "plan": "firstclaim",
        "name": "First claim",
        "paid": true,
        "price": {
          "amount": 3600,
          "currency": "gbp",
          "interval": "year"
        }
      },
      {
        "plan": "social",
        "name": "Social runner",
        "paid": true,
        "price": {
          "amount": 1500,
          "currency": "gbp",
          "interval": "year"
        }
      }
    ],
    "lists": [
      {
        "list": "availability",
        "label": "Race replies",
        "by": "member",
        "status_options": [
          "Sent",
          "A team",
          "B team",
          "Reserve",
          "Not this time"
        ],
        "reply": true,
        "fields": [
          {
            "name": "fixture",
            "type": "choice",
            "label": "Race",
            "required": true,
            "options": [
              "Winter League 3 · Tollgate Park",
              "Winter League 4 · Gorse Hill",
              "Harrier Relays",
              "Winter League 5 · Tolvan Moor",
              "Winter League 2 · Carn Ridge",
              "Winter League 1 · Pennick Woods",
              "Tollgate 10k"
            ]
          },
          {
            "name": "date",
            "type": "date",
            "label": "Race day",
            "required": true
          },
          {
            "name": "available",
            "type": "choice",
            "label": "Can you run?",
            "required": true,
            "options": [
              "Yes",
              "Maybe",
              "No"
            ]
          },
          {
            "name": "team",
            "type": "choice",
            "label": "Team",
            "options": [
              "A team",
              "B team",
              "Either"
            ]
          },
          {
            "name": "memo",
            "type": "long_text",
            "label": "Note for the captain"
          }
        ]
      },
      {
        "list": "results",
        "label": "Race results",
        "by": "owner",
        "fields": [
          {
            "name": "race",
            "type": "text",
            "label": "Race (as named in the fixture list)",
            "required": true
          },
          {
            "name": "date",
            "type": "date",
            "label": "Date",
            "required": true
          },
          {
            "name": "distance",
            "type": "text",
            "label": "Distance"
          },
          {
            "name": "time",
            "type": "text",
            "label": "Time",
            "required": true
          },
          {
            "name": "position",
            "type": "number",
            "label": "Position"
          },
          {
            "name": "pb",
            "type": "choice",
            "label": "Personal best",
            "options": [
              "Yes",
              "No"
            ]
          }
        ]
      }
    ],
    "demo": {
      "member": {
        "name": "Jess Murray",
        "email": "jess.murray@example.com",
        "profile": {
          "name": "Jess Murray",
          "usual_pace": "8–9 min/mile",
          "about": "Sub-45 10k this winter, then the Penmarrow Half."
        }
      },
      "plans": [
        "firstclaim"
      ],
      "rows": {
        "availability": [
          {
            "fixture": "Harrier Relays",
            "date": "+7w:sat",
            "available": "Yes",
            "team": "Either",
            "memo": "Happy to run the first leg.",
            "_added": "today",
            "_status": "Sent"
          },
          {
            "fixture": "Winter League 4 · Gorse Hill",
            "date": "+4w:sun",
            "available": "Maybe",
            "team": "Either",
            "memo": "Might be away that weekend; I'll know by the 1st.",
            "_added": "-1d",
            "_status": "Reserve",
            "_reply": "First reserve for the A team. I'll confirm by Thursday. Fenella"
          },
          {
            "fixture": "Winter League 3 · Tollgate Park",
            "date": "+1w:sun",
            "available": "Yes",
            "team": "A team",
            "_added": "-6d",
            "_status": "A team",
            "_reply": "You're in the A team. Minibus leaves the pavilion at 08:45; vests in the kit bag. Fenella"
          },
          {
            "fixture": "Winter League 2 · Carn Ridge",
            "date": "-2w:sun",
            "available": "Yes",
            "team": "A team",
            "_added": "-4w:wed",
            "_status": "A team",
            "_reply": "A team, 5th scorer. Great run last time."
          },
          {
            "fixture": "Winter League 1 · Pennick Woods",
            "date": "-5w:sun",
            "available": "Yes",
            "team": "Either",
            "_added": "-7w:tue",
            "_status": "Not this time",
            "_reply": "Both teams were full; run as an individual and it still counts for the league."
          },
          {
            "fixture": "Tollgate 10k",
            "date": "-8w:sun",
            "available": "Yes",
            "team": "B team",
            "_added": "-11w:mon",
            "_status": "B team"
          }
        ],
        "results": [
          {
            "race": "Winter League 2 · Carn Ridge",
            "date": "-2w:sun",
            "distance": "8 km XC",
            "time": "36:58",
            "position": 41,
            "pb": "No",
            "_added": "-1w:mon"
          },
          {
            "race": "Winter League 1 · Pennick Woods",
            "date": "-5w:sun",
            "distance": "7.5 km XC",
            "time": "35:12",
            "position": 54,
            "pb": "No",
            "_added": "-4w:mon"
          },
          {
            "race": "Tollgate 10k",
            "date": "-8w:sun",
            "distance": "10 km road",
            "time": "46:05",
            "position": 112,
            "pb": "Yes",
            "_added": "-7w:mon"
          },
          {
            "race": "Dunmere 5k",
            "date": "-12w:sat",
            "distance": "5 km road",
            "time": "21:48",
            "position": 23,
            "pb": "Yes",
            "_added": "-12w:sun"
          },
          {
            "race": "Penmarrow Spring 10",
            "date": "-26w:sun",
            "distance": "10 miles road",
            "time": "1:21:40",
            "position": 188,
            "pb": "No",
            "_added": "-25w:mon"
          }
        ]
      }
    }
  },
  "pages": [
    {
      "path": "index.html",
      "label": "Home",
      "purpose": "The public club page: Tollgate Harriers in Penmarrow, club nights and the Sunday long run, what the members' app does, the season's fixtures, yearly subs and how to ask to join"
    },
    {
      "path": "app/index.html",
      "label": "Home",
      "purpose": "Signed out: the welcome screen and Ask to join. Signed in: a greeting, the membership card with subs, the next race and whether you're picked, your latest result and PB, and quick actions"
    },
    {
      "path": "app/races.html",
      "label": "Races",
      "purpose": "The season's fixtures with venue, distance and start; tapping one fills the reply (can you run, team, a note) and Send to the captain saves it"
    },
    {
      "path": "app/selection.html",
      "label": "Selection",
      "purpose": "Your replies with the captain's answer (Sent, Picked, Reserve, Not this time) and note, upcoming first, then past races"
    },
    {
      "path": "app/results.html",
      "label": "Results",
      "purpose": "Race results the committee adds (time, position, distance) newest first, with personal bests marked and season totals"
    },
    {
      "path": "app/subs.html",
      "label": "Subs",
      "purpose": "Your membership and yearly subs, what they cover, the other membership, and renewing or cancelling"
    },
    {
      "path": "app/account.html",
      "label": "Account",
      "purpose": "Your profile (name, usual pace, races you're aiming for), email, devices, billing, renewal and leaving (Page Lemon's account block)"
    },
    {
      "path": "privacy.html",
      "label": "Privacy",
      "purpose": "The privacy notice, with blanks the Site Owner fills in"
    }
  ],
  "files": [
    "index.html",
    "privacy.html",
    "app/index.html",
    "app/races.html",
    "app/selection.html",
    "app/results.html",
    "app/subs.html",
    "app/account.html",
    "styles.css",
    "site.js",
    "kit.css",
    "kit.js",
    "kit-icons.svg",
    "site.webmanifest",
    "favicon.svg",
    "og.png",
    "apple-touch-icon.png",
    "icon-192.png",
    "icon-512.png",
    "icon-512-maskable.png",
    "art/club-track.svg",
    "art/race-xc.svg",
    "art/race-road.svg",
    "art/race-relay.svg"
  ],
  "facts": [
    "club name and address",
    "club nights and the Sunday long run",
    "secretary's name and email",
    "the yearly subs for each membership",
    "the season's fixtures with dates, venues and start times",
    "phone and privacy contact"
  ],
  "interview": [
    "What is the club called, and where does it meet for club nights?",
    "Who reads the requests to join, and which email address should people write to?",
    "What are the yearly subs for each membership, and what does each one include?",
    "Which fixtures are on this season, with dates, venues and start times?",
    "Who picks the teams, and who adds race results for each member?",
    "What address and privacy contact should the privacy notice show?"
  ],
  "customise": {
    "strings": [
      "Tollgate Harriers, its pavilion address, phone, email and secretary in the header, footer, titles and copy: replace every data-pl-fill fact with the owner's own. Replace the name in site.webmanifest too.",
      "Fill in every highlighted blank on privacy.html before members join (not legal advice: https://pagelemon.com/agents/member-app-legal).",
      "Make the availability list (with status_options and reply) and the results list exactly as memberApp.lists says. The race names are the fixture's options: change them on app/races.html, index.html and in the list together.",
      "Fixture dates: each fixture on app/races.html and index.html has data-weeks and data-day so the sample stays current; for a real season replace them with data-date=\"2026-11-08\" (site.js reads either).",
      "Keep setup_app with signup \"request\", the request note and the profile fields, so the committee approves each new member in the Dashboard.",
      "Set the plans with save_plan (firstclaim and social, yearly) at the club's subs and change the prices on index.html and app/subs.html together.",
      "The captain answers each reply in the Dashboard (Apps, Entries): A team, B team, Reserve or Not this time, with a short note the member reads on app/selection.html. Results are the committee's rows, assigned to each member.",
      "A running club app only: never add health, injury, weight, date of birth, payment card, bank or ID fields, and never collect anything about under-18s."
    ],
    "colours": "Edit the --k-brand, --k-hero and --k-gold tokens at the top of styles.css; light and dark follow the device.",
    "fonts": "Saira Extra Condensed and Saira, loaded from Google Fonts on every page; your AI can self-host them on request.",
    "sections": "Public: index.html. Member pages under /app use the shared app kit (kit.css, kit.js, kit-icons.svg: never edit them) and site.js (fixture dates, race pictures). On app/races.html each fixture is one card with data-race, data-weeks/data-day or data-date.",
    "images": "art/club-track.svg is the welcome and hero picture (1200×1260); art/race-xc.svg, race-road.svg and race-relay.svg are the race pictures (600×600): they show on each public fixture band and in the reply summary on races.html. Replace them with the club's own photos at the same sizes, never a stranger's face."
  },
  "schemaVersion": 2,
  "updated": "2026-10-22"
}
