Skip to content

Proposal: Logged-out Brochure, Try-it-out Demo, Unified Settings, SEO

Status: Shipped · Last updated: 2026-07-13 · Tracking: issue #1 (phases 3–6)

Summary

The logged-out experience becomes a browsable product brochure: a whole-site advert at /, a full-page capability advert on every mode route, and a read-only seeded Chat demo requiring no key. Shared settings move to a unified TopBar-gear dialog, docs become reachable while logged out, and basic SEO artifacts ship with the static build.

Decisions (resolving issue #1 open questions)

  • Routing (supersedes "/ is Chat"): Chat lives at /chat; / is the front door — the whole-site brochure logged out, an immediate replaceState redirect to /chat logged in. Rationale: all five modes get symmetric routes, ?thread= stops polluting the root URL, and the root page stays a pure marketing/SEO surface. The layout's URL→mode sync treats / as Chat so the selector reads sensibly on the front door.
  • Demo model (Q1–3): no key of any kind. DEMO_THREADS are static in-memory fixtures ($lib/chat/demo/threads.ts) rendered read-only by DemoChatView; they never touch IndexedDB, so there is nothing to promote into a real login — always disposable. Chat-only demo in v1; the other modes get rich static adverts. Entry points: the Chat brochure's "Try it out" button and /chat?demo (linked from the site brochure); exit returns to the brochure.
  • Settings UX (Q8–9): single scrollable dialog with sections (AI endpoint / Web research / Sync), not tabs — it absorbed the former Search dialog and Read's app-settings panel wholesale (both deleted). Relay/Blossom lists are editable in the Sync section (carried over from Read's panel); richer relay/mint UX stays post-MVP. settingsUi.open lives in $lib/settings/ui.svelte.ts; the dialog is rendered once by the root layout so it works on every route, logged out included. Per-mode gears remain as shortcuts that open the same dialog.
  • SEO ambition (Q10): option A — robots.txt + sitemap.xml in static/, per-route <svelte:head> titles/descriptions, default meta in app.html. The app stays ssr = false, so per-route meta is applied client-side: JS-executing crawlers (Google) see it, plain fetchers see only app.html's defaults. /docs/ (MkDocs, real HTML) carries the deep SEO weight. Revisit prerendered brochure HTML (option B) only if search traffic matters later.

Shape

  • $lib/components/brochure/ModeBrochure.svelte — generic full-page advert (icon, name, optional status badge, tagline, description, feature grid, children slot, keypair-CTA footer). Each mode route passes its own copy inline; Debate uses it logged in and out with an "in design" badge + proposal link (ModeStub deleted).
  • $lib/components/brochure/SiteBrochure.svelte/ hero, three sovereignty principles, five mode cards (from MODES), demo + docs CTAs, GitHub footer.
  • TopBar gains a docs link (/docs/) and a settings gear, both visible logged out.
  • e2e: e2e/brochure.test.ts (site brochure, per-mode brochures, demo flow, ?demo deep link, logged-out docs/settings chrome, settings persistence).

Site pages (added 2026-07-16, feedback 6d17256a)

Static first-class pages rounding out the brochure surface: /about, /terms, /privacy, /blog, /zap, all rendered by the shared $lib/components/brochure/InfoPage.svelte wrapper (Scrollport + reading column + back-to-home) and linked from a new footer on SiteBrochure. Same SEO stance as the rest of the SPA (client-side <svelte:head>, listed in sitemap.xml). The zap page is deliberately a placeholder — actual donation wiring (lightning address / LNURL / nutzaps) is deferred per the user's triage note; the blog is an empty shell pointing at /docs/whats-new/ until real posts exist.

Deferred

Seeded demos for Read/Search/Synthesize (static adverts only for now), prerendered brochure HTML (SEO option B), user-editable Chat system prompt in settings, relay/mint configuration UX beyond the editable lists.