{
  "name": "Pilot",
  "slug": "pilot",
  "blocks": ["Pages", "Lists", "Sign-in: users"],
  "persona": "startups",
  "keywords": [
    "beta portal",
    "beta testers",
    "waitlist",
    "feature requests",
    "feature voting",
    "early access",
    "bug reports",
    "startup",
    "product roadmap",
    "SaaS",
    "beta sign-in",
    "tester feedback"
  ],
  "description": "An app template for a startup's closed beta: people ask to join from the sign-in page, and approved testers report bugs and ideas with screenshots, follow each one from Received to Shipped with the team's reply, vote on the roadmap, read what shipped and earn a founding-tester price. A public page, six member screens under /app and a privacy notice with blanks.",
  "audience": [
    "startups running a closed beta",
    "product teams that take feature requests from early users",
    "founders who want a waitlist before launch"
  ],
  "category": "Beta portal",
  "job": "member-app",
  "categoryId": "requests",
  "alsoFits": [
    "early access programme",
    "customer advisory board",
    "product feedback portal",
    "SaaS beta"
  ],
  "direction": "Highlighter zine on cool paper: big grotesk headlines, marker swashes on what's new and a git-graph roadmap",
  "mood": [
    "light",
    "bold",
    "modern"
  ],
  "fonts": [
    "Geist",
    "Geist Mono"
  ],
  "memberApp": {
    "path": "/app",
    "setup": {
      "signup": "request",
      "request_note": "We let in 20 testers a week, in the order you asked. You'll get an email when you're in.",
      "profile_fields": [
        {
          "name": "name",
          "type": "text",
          "label": "Your name",
          "required": true
        },
        {
          "name": "company",
          "type": "text",
          "label": "Company"
        },
        {
          "name": "role",
          "type": "choice",
          "label": "Your role",
          "options": [
            "Partner",
            "Practice manager",
            "Accountant",
            "Bookkeeper",
            "Other"
          ]
        }
      ],
      "display_field": "name"
    },
    "lists": [
      {
        "list": "requests",
        "label": "Bug reports and ideas",
        "by": "member",
        "status_options": [
          "Received",
          "Planned",
          "In progress",
          "Shipped",
          "Not planned"
        ],
        "reply": true,
        "fields": [
          {
            "name": "title",
            "type": "text",
            "label": "Short title",
            "required": true
          },
          {
            "name": "kind",
            "type": "choice",
            "label": "What is it?",
            "required": true,
            "options": [
              "Bug",
              "Feature idea",
              "Question"
            ]
          },
          {
            "name": "area",
            "type": "choice",
            "label": "Area",
            "required": true,
            "options": [
              "Imports",
              "Matching rules",
              "Reports",
              "Team and permissions",
              "Something else"
            ]
          },
          {
            "name": "date",
            "type": "date",
            "label": "When did it happen?"
          },
          {
            "name": "details",
            "type": "long_text",
            "label": "Details",
            "required": true
          },
          {
            "name": "screenshot",
            "type": "photo",
            "label": "Screenshot"
          }
        ]
      },
      {
        "list": "votes",
        "label": "Roadmap votes",
        "by": "member",
        "fields": [
          {
            "name": "item",
            "type": "choice",
            "label": "Roadmap item",
            "required": true,
            "options": [
              "Statement import for CSV and OFX files",
              "Matching rules you can read",
              "Split a payment across invoices",
              "Client reconciliation reports as PDF",
              "Review queue for the whole team",
              "Permissions per client folder",
              "Multi-currency matching",
              "Export to common accounting packages"
            ]
          },
          {
            "name": "priority",
            "type": "choice",
            "label": "How much you need it",
            "required": true,
            "options": [
              "Must have",
              "Nice to have"
            ]
          },
          {
            "name": "why",
            "type": "long_text",
            "label": "Why it matters to your firm"
          }
        ]
      }
    ],
    "demo": {
      "member": {
        "name": "Marcus Ellery",
        "email": "marcus.ellery@example.com",
        "profile": {
          "name": "Marcus Ellery",
          "company": "Ellery Shah Accountants",
          "role": "Partner"
        }
      },
      "plans": [],
      "rows": {
        "requests": [
          {
            "kind": "Bug",
            "title": "A matched line came back as unmatched",
            "area": "Matching rules",
            "date": "-1d",
            "details": "After I switched off the rule for Brightwater Print Co, a line I had already matched by hand came back as unmatched. Happened twice on the September statement.",
            "_added": "-1d",
            "_status": "Received"
          },
          {
            "kind": "Feature idea",
            "title": "Keyboard shortcut to match the selected line",
            "area": "Matching rules",
            "details": "We clear 300 lines a month per client. Pressing M to match the highlighted pair would save a lot of mouse work.",
            "_added": "-6d",
            "_status": "In progress",
            "_reply": "Love this. It's in 0.9.5 as M to match and U to undo, behind a setting first. Dominic"
          },
          {
            "kind": "Bug",
            "title": "Import stops at a blank line in the file",
            "area": "Imports",
            "date": "-12d",
            "details": "Our bank's CSV export has a blank line near the bottom. The import stops there and skips every line below it. The screenshot shows line 214.",
            "screenshot": "art/sample-screenshot.svg",
            "_added": "-12d",
            "_status": "Shipped",
            "_reply": "Fixed in 0.9.4: imports now skip blank lines and tell you how many. Thanks for the file, it made this a one-day fix. Priya"
          },
          {
            "kind": "Feature idea",
            "title": "One PDF report per client folder",
            "area": "Reports",
            "details": "We reconcile six clients from one bank account. A report per client, unmatched lines at the top, would save us a morning each month.",
            "_added": "-17d",
            "_status": "Planned",
            "_reply": "Good one. It fits the client PDF reports on the roadmap under Next, and we'll ask you to try it first. Dominic"
          },
          {
            "kind": "Question",
            "title": "Can one OFX file hold two accounts?",
            "area": "Imports",
            "details": "Some statements hold a current and a savings account in one OFX file. Should we split them before importing?",
            "_added": "-24d",
            "_status": "Not planned",
            "_reply": "For now, please split the file by account first. Ledgerline reads one account per file and we're keeping it that way for the beta. Priya"
          }
        ],
        "votes": [
          {
            "item": "Client reconciliation reports as PDF",
            "priority": "Must have",
            "why": "We send each client a monthly summary and build it by hand in a spreadsheet today.",
            "_added": "-9d"
          },
          {
            "item": "Review queue for the whole team",
            "priority": "Must have",
            "why": "Three of us work the same client's statements and can't see which lines someone already cleared.",
            "_added": "-9d"
          },
          {
            "item": "Multi-currency matching",
            "priority": "Nice to have",
            "why": "Two of our clients invoice in euros.",
            "_added": "-8d"
          }
        ]
      }
    }
  },
  "files": [
    "index.html",
    "privacy.html",
    "app/index.html",
    "app/send.html",
    "app/reports.html",
    "app/roadmap.html",
    "app/changelog.html",
    "app/account.html",
    "styles.css",
    "app.js",
    "kit.css",
    "kit.js",
    "kit-icons.svg",
    "art/swash.svg",
    "art/swash-pink.svg",
    "art/sample-screenshot.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: a poster with the latest changelog zine page and the roadmap as a branch graph, the tester app at real size, how the beta works and the founding price, then sign-in"
    },
    {
      "path": "app/index.html",
      "label": "Home (app)",
      "purpose": "Signed out: the beta welcome and ask to join. Signed in: the latest What's new zine page, your latest report with its status line and the team's reply, the founding-tester progress and what's being built now"
    },
    {
      "path": "app/send.html",
      "label": "Send",
      "purpose": "Report a bug, idea or question on a blank zine page: kind, title, area, when it happened, details and a screenshot"
    },
    {
      "path": "app/reports.html",
      "label": "Your reports",
      "purpose": "Every report newest first with its status line (Received, Planned, In progress, Shipped, or Not planned), the team's reply and the screenshot"
    },
    {
      "path": "app/roadmap.html",
      "label": "Roadmap",
      "purpose": "The roadmap as a branch graph: Now, Next and Later with a vote on each item (must have or nice to have, and why), what already shipped on main, and your votes"
    },
    {
      "path": "app/changelog.html",
      "label": "Changelog",
      "purpose": "What's new: dated release issues as zine pages, with the changes testers asked for marked"
    },
    {
      "path": "app/account.html",
      "label": "Account",
      "purpose": "The beta pass (name, company, role, reports sent), the founding-tester progress and the account block (email, profile, devices, leaving)"
    },
    {
      "path": "privacy.html",
      "label": "Privacy",
      "purpose": "The privacy notice for testers, with blanks the owner fills in"
    }
  ],
  "facts": [
    "business name Ledgerline",
    "office address",
    "phone number",
    "beta email",
    "founders' names",
    "beta start (September 2026)",
    "testers in so far (140)",
    "waitlist pace (20 testers a week)",
    "privacy contact and address"
  ],
  "interview": [
    "What is the product called, and what does it do for the firms that use it?",
    "Who runs the company, and what is the office address?",
    "Which email address and phone number should testers and the press use?",
    "How many testers do you let in each week, and in what order?",
    "What are the roadmap items in Now, Next and Later, in your own words?",
    "What does the beta cost, and what will you tell testers before any charge starts?",
    "What address and privacy contact should the privacy notice show?"
  ],
  "customise": {
    "strings": [
      "Ledgerline in the header, footer and titles, with the founders Priya Venkataraman-Holt and Dominic Arkwright, the office address 3 Counting House Yard, Mintbury QP6 2XA and the phone 01632 960 856. Replace every data-pl-fill fact with the company's own, and site.webmanifest name and short_name.",
      "Fill in every highlighted blank on privacy.html with the Site Owner before testers use the site (not legal advice: https://pagelemon.com/agents/member-app-legal)",
      "The roadmap items are the votes list's item options: change them with save_app_list and on app/roadmap.html (one commit card and hidden item value per item), in the roadmap graph on index.html and in Being built now on app/index.html, using the same words.",
      "The release notes are static HTML on app/changelog.html: add each release at the top as a new zine page, move the swash marks (class lg-mark, lg-mark-fix for fixed bugs) to the new issue, and update the What's new page on app/index.html and index.html to match.",
      "The founding-tester offer (3 reports, 50% off the first year after launch) is on app/index.html, app/send.html, app/reports.html, app/account.html and index.html; app.js reads the threshold from data-goal. Change or remove it in all of them together.",
      "Testers see only their own reports and votes. Never add live vote counts, other testers' reports, or a member directory to the pages."
    ],
    "colours": "Edit the tokens at the top of styles.css (--lg-paper, --lg-ink, --lg-pencil, --lg-green, and the dark set below them). The highlighter swash is art/swash.svg (art/swash-pink.svg for fixed bugs): recolour its fill to change it, and keep ink words on it",
    "fonts": "Google Fonts: Geist (headlines, text) and Geist Mono (versions, dates, labels, counts), one <link> in every page head and --lg-sans / --lg-mono in styles.css. If the owner prefers no font service, download both (OFL) into a fonts/ folder and switch to @font-face.",
    "sections": "Joining is request-to-join: setup_app with memberApp.setup (signup \"request\", request_note and profile_fields), then save_app_list for requests (status_options and reply on) and votes. The founders approve waiting requests in the Dashboard (Apps, Requests), 20 a week. The owner's path: each report arrives in Apps, Entries; the team sets its status (Received, Planned, In progress, Shipped, Not planned) and writes a reply, which the tester sees on Home and Your reports, with an email when it changes; votes show in Entries too, for counting. app/index.html is Home with the signed-out welcome, app/send.html the report form, app/reports.html the tester's reports, app/roadmap.html voting, app/changelog.html the release notes, app/account.html the account block. app.js tags each report kind, fills the founding-tester commit dots from the reports total and shows your roadmap votes as commit dots (Must have two, Nice to have one).",
    "images": "favicon.svg is the branch mark (a green main line, a merged branch and a highlighter swash); the PNG icons and manifest are made from it. The zine pages, the roadmap graph and the status lines are HTML and CSS, so there are no product screenshots to replace. art/swash.svg and art/swash-pink.svg are the marker swashes. art/sample-screenshot.svg is the sample tester's screenshot in the preview only."
  },
  "schemaVersion": 2,
  "updated": "2026-10-26"
}
