chain-studio/docs/landing-page-design.md
flemming-it 711436b71d feat(studio): carousel size lock, store-actionable today stories, HTTPS MCP suggestions in settings (v0.36.0)
Three concrete changes against operator feedback that the
Today carousel was visually jumping when arrowed and
genre-mixing platform-architecture education with store-
actionable highlights.

- Carousel size pinned. The hero's outer Container picks up
  `BoxConstraints(minHeight: 240)` so a slide with one
  paragraph and a slide with three render at the same
  height. Prev/next no longer reflows the rest of the page.

- Today fallback stories trimmed and re-themed. The four
  shipped slides drop to three:
  - "Public sources" (DeepWiki / Semgrep one-click) — kept
  - "Three text modules already in the store" — new,
    points the operator at text.extract / text.summarize /
    text.translate in the grid below
  - "Try the extract → summarize flow" — new, points at
    flows/extract-summarize.yaml
  Architecture-education stories (sandbox model, hash-
  chained audit, air-gap posture) are gone from this surface
  — they belong on the Welcome page that
  `docs/landing-page-design.md` lays out.

- DeepWiki + Semgrep added to the Settings → MCP-Clients
  add-server suggestion-chip catalogue. Until now the chips
  were nine stdio servers that need Node + npx; the two
  HTTPS public sources only existed as one-click cards in
  the Today hero. Operators who dismissed the hero had no
  in-Settings path to find them. The new entries sit at the
  top of the catalogue with an explicit "Public HTTPS — no
  Node, no API key" descriptor and the same icons the Today
  hero already uses.

- `docs/landing-page-design.md` (new). Captures the design
  for a sidebar Welcome page that hosts the three-pillar
  intro, the trust-posture deck, the getting-started
  checklist, and an embedded-doc reader so operator-facing
  documentation stays inside Studio (`flutter_markdown`
  rendering of bundled `assets/docs/*.md`) instead of
  clicking out to a browser. Three-phase implementation
  plan: scaffolding, embedded docs, computed checklist.
  Build is gated on operator alignment; this doc is the
  alignment artefact.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-05-08 23:53:05 +02:00

9.2 KiB

Welcome / Landing-page design

Status: Design draft. Not built yet.

Why we need it

The Today-Hero in the Store mixed two genres of editorial content:

  • Operator-actionable: "DeepWiki is two clicks away", "text.summarize is in the grid", "try the extract→summarize flow". These belong in the Store carousel — they point at store / federation items the operator can act on.
  • Architecture education: "every module is sandboxed", "the audit log is hash-chained", "the hub fits in one binary, no Docker". These are what F∆I is — they belong on a Welcome page that introduces the platform on first launch and stays available afterwards as a reference.

The operator feedback that made this distinction explicit:

"interessante store einträge oder auch mcp etc zeigen und nicht einfach etwas übers system. Stattdessen brauchen wir als erstes im system eine art landing page die genau das macht und auch zu doku verlinkt, aber diese auch in das system optisch integriert und nicht einfach nach außen verlinkt."

The architectural-education stories already left the Store carousel in the same release. The Welcome page is where they land.

Page shape

A new top-level Studio surface, accessed from the sidebar above Doctor. First-launch operators land here automatically; returning operators can come back any time.

┌──────────────────────────────────────────────────────────┐
│  AppBar: Welcome                                         │
├──────────────────────────────────────────────────────────┤
│  ┌────────────────────────────────────────────────────┐ │
│  │  HERO                                               │ │
│  │  F∆I Platform                                       │ │
│  │  Deterministic workflow engine for AI-assisted     │ │
│  │  document processing in regulated environments.    │ │
│  └────────────────────────────────────────────────────┘ │
│                                                          │
│  ┌──── Three-pillar row (Hub / Module / Flow) ────┐    │
│  │  ┌──────────┐  ┌──────────┐  ┌──────────┐      │    │
│  │  │   HUB    │  │  MODULE  │  │   FLOW   │      │    │
│  │  │ icon     │  │ icon     │  │ icon     │      │    │
│  │  │ One bin- │  │ Does one │  │ YAML     │      │    │
│  │  │ ary that │  │ thing,   │  │ chains   │      │    │
│  │  │ runs the │  │ sandboxed│  │ modules  │      │    │
│  │  │ flows    │  │ WASM     │  │ together │      │    │
│  │  └──────────┘  └──────────┘  └──────────┘      │    │
│  └────────────────────────────────────────────────┘    │
│                                                          │
│  ┌──── Trust posture ─────────────────────────────┐    │
│  │  🛡  Sandbox by default                          │    │
│  │     Every module declares fs / net / env perms; │    │
│  │     the hub enforces them. Click "Doctor →      │    │
│  │     Modules" to see live permissions per module.│    │
│  │                                                 │    │
│  │  ⛓  Tamper-evident audit log                    │    │
│  │     Every event hash-chained; Doctor verifies   │    │
│  │     end-to-end on every load. WORM-1 promise.   │    │
│  │                                                 │    │
│  │  ✈  Air-gap ready                               │    │
│  │     One binary, SQLite state, no Docker, no     │    │
│  │     external services. Once a module is         │    │
│  │     installed, the flow runs without further    │    │
│  │     network access.                             │    │
│  └────────────────────────────────────────────────┘    │
│                                                          │
│  ┌──── Getting-started checklist ─────────────────┐    │
│  │  ☐ Configure System AI (Settings → System AI)  │    │
│  │  ☐ Add a public MCP source (Store → DeepWiki)  │    │
│  │  ☐ Install your first text module              │    │
│  │  ☐ Run the extract → summarize sample flow     │    │
│  └────────────────────────────────────────────────┘    │
│                                                          │
│  ┌──── Documentation, embedded ───────────────────┐    │
│  │  Architecture map · Module experience ·        │    │
│  │  Flow composition · Compliance posture          │    │
│  │  → click opens an in-app reader, not a browser │    │
│  └────────────────────────────────────────────────┘    │
└──────────────────────────────────────────────────────────┘

Optical integration of docs

The user constraint:

"diese auch in das system optisch integriert und nicht einfach nach außen verlinkt"

So clicking a documentation card does not open a browser. Instead a _DocReaderSheet (modal bottom-sheet, same shape as _StoreDetailSheet) renders the markdown inline using the existing flutter_markdown package — same one the Store uses for module READMEs. The doc source is bundled with Studio as assets/docs/*.md, kept in sync via a build step that copies the relevant files from fai_platform/docs/.

Pros:

  • Air-gap-tauglich (no network call to read docs)
  • Operator stays in Studio context — Cmd-Tab to a browser breaks flow
  • Same look-and-feel as module-doc rendering
  • Bilingual: each doc has a _de.md sibling next to .md

Cons / tradeoffs:

  • Studio binary grows by the size of bundled docs (a few hundred KB)
  • Doc-update lifecycle: a Studio release ships a fixed snapshot. Live-fetched-from-hub is a Phase 1 question.

Getting-started checklist

Stateful — the page tracks which items the operator has completed and persists state to ~/.fai/studio/onboarding.json (same shape as theme/locale persistence in hub.dart). Each checkmark is computed:

  • ✓ System AI configured: HubService.systemAiStatus().enabled
  • ✓ Public MCP source added: any mcp.<server>.<tool> in store
  • ✓ First text module installed: any installed module whose name starts with text.
  • ✓ Sample flow run: any flow.completed event in audit log naming extract-summarize.yaml (or any flow that uses both text.extract and text.summarize)

Operator can dismiss the checklist once everything is checked.

Sidebar placement

The Welcome page becomes the new sidebar default — index 0, above Doctor. First-launch experience hits it; afterward operators most often go to Store / Audit, but the home icon stays one click away.

labelOf(context) for the Welcome page returns l.navWelcome ("Welcome" / "Willkommen"). New ARB keys: navWelcome, plus the section-header strings (already mostly covered by existing doctorChain* / doctorPathLog keys that we can reference from the doc-card descriptions).

Implementation phases

Big enough that a single commit doesn't make sense. Three phased PRs:

  1. Phase A — sidebar + scaffolding + hero + three-pillar row + trust-posture row. No docs yet, just the static content with hard-coded strings (with i18n). Lands without the embedded-doc reader.
  2. Phase B — bundled markdown docs + _DocReaderSheet. Pick 4-5 source docs from fai_platform/docs/architecture/ that map to operator concerns (security, host-services, flow-experience, compliance-gaps). Add a build script that syncs them into assets/docs/.
  3. Phase C — getting-started checklist with computed state. Adds the persistence layer + the audit-log inspection helper.

Out of scope

  • A "tutorial mode" that walks the operator through the steps interactively. Editorial checklist + concise explanations is enough for v1; tutorial state is a Phase 1+ idea.
  • Live-fetched docs from hub.fetch_doc(...). Air-gap posture requires bundled docs.
  • Per-deployment branding (custom logo / color). Not a KRITIS need.