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 immediatereplaceStateredirect to/chatlogged 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_THREADSare static in-memory fixtures ($lib/chat/demo/threads.ts) rendered read-only byDemoChatView; 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.openlives 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.xmlinstatic/, per-route<svelte:head>titles/descriptions, default meta inapp.html. The app staysssr = false, so per-route meta is applied client-side: JS-executing crawlers (Google) see it, plain fetchers see onlyapp.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 (fromMODES), 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,?demodeep 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.