Bendik Aagaard LynghaugandClaude Sonnet 5 bc18add801
Lint and reload / lint-and-reload (push) Successful in 2s
Lint with portal's question_lint binary, not the hand-maintained yq/jq script
lint.sh only ever checked shape (missing id/name, duplicate ids, bad
requirement types) - it never validated transition targets against the
real state machines. question_lint runs portal's actual validation
logic (content::validate_questions) with no portal build required in
this repo's CI, since portal's deploy job now publishes it to a stable
path on the same runner/host.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-11 21:16:54 +02:00

portal-content

Question/alternative/feature content for the portal app, kept in its own repo so content edits don't require a Rust rebuild or touch app code at all.

Schema

Each file in questions/ is one Question (see portal's src/content.rs for the exact struct). A question has one or more alternatives; each alternative is a small form made of features, each holding zero or more requirements (input fields).

id: /some-path           # matches a route; "/" is the landing page; English slugs
name: Headline
description: >
  Markdown body text.
alternatives:
  - name: Alternative label
    description: One line explaining this path.
    action: /next-question   # id of the question to advance to on submit
    consequence: [Button label]
    features:
      - name: A feature/section heading
        description: Optional supporting text.
        requirements:
          - name: email
            label: Email
            type: email

type on a requirement is one of: text, textarea, email, tel, select. Omit for plain text. Mark a requirement optional: true if it isn't required.

There is deliberately no color/icon styling here — the app has a single brand accent variable, not per-alternative colors. And there's no branching/criteria language yet: today a human reads submissions off NATS and decides what happens next. If that grows into something an LLM posts follow-up questions into later, it publishes into the same shape these files already are — this repo's format doesn't need to change for that, just its source.

Adding a question

Drop a new questions/<id>.yaml file and reference its id from an existing alternative's action. No registration step - the app loads every file in the directory at startup.

S
Description
Question/alternative content for the portal app, kept separate so content edits never need a Rust rebuild.
Readme
228 KiB
Languages
JavaScript 100%