From 9bf1c316058fed78bdb1d357cc211b43117cb397 Mon Sep 17 00:00:00 2001 From: Mathias Date: Mon, 8 Jun 2026 13:43:32 +0200 Subject: [PATCH] fix(web): correct stale welcome-page invite copy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The landing page promised "if you have an invite link, it will set up your account automatically" — but invites moved to Authentik (ADR-019); Tapir no longer handles invite links and "Get Started" goes straight to OIDC. Replace with honest "invite-only — if you've been invited, sign in" and set the gradual-fill expectation before the login wall (UX review A5). Test pins the stale phrase out. Co-Authored-By: Claude Opus 4.8 (1M context) --- internal/web/views.templ | 2 +- internal/web/views_templ.go | 10 +++++----- internal/web/welcome_test.go | 5 +++++ 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/internal/web/views.templ b/internal/web/views.templ index e55b3df..403a024 100644 --- a/internal/web/views.templ +++ b/internal/web/views.templ @@ -84,7 +84,7 @@ templ WelcomePage(user User, loggedIn bool) { -

Access is by invitation. If you have an invite link, it will set up your account automatically. Returning users with credentials can log in above.

+

Tapir is invite-only right now. If you've been invited, sign in above. New summaries land gradually — Tapir fetches captions slowly to respect YouTube's limits.

} } diff --git a/internal/web/views_templ.go b/internal/web/views_templ.go index c5d93ad..633f41d 100644 --- a/internal/web/views_templ.go +++ b/internal/web/views_templ.go @@ -215,7 +215,7 @@ func WelcomePage(user User, loggedIn bool) templ.Component { return templ_7745c5c3_Err } } else { - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "

Watch less, know more

Tapir summarizes the videos your subscriptions publish, so you can skim the gist and decide what is worth your time.

Access is by invitation. If you have an invite link, it will set up your account automatically. Returning users with credentials can log in above.

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "

Watch less, know more

Tapir summarizes the videos your subscriptions publish, so you can skim the gist and decide what is worth your time.

Tapir is invite-only right now. If you've been invited, sign in above. New summaries land gradually — Tapir fetches captions slowly to respect YouTube's limits.

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -623,11 +623,11 @@ func summaryList(rows []store.SummaryRow, hasConnected bool) templ.Component { // /v/{id}/retry-now (HTMX swaps outerHTML). Five footer states, status-primary: // 1. Summarized — preview + chip + actions; no button. // 2. No captions (TranscriptStatus=="none") — terminal; "No transcript available"; no button. -// 3. Queued (SummarizeRequested) — "Queued · waiting for the next run"; no button. -// 4. Rate-limited — "Fetching soon" + quiet "Summarize now" → /retry-now. -// 5. Pending (else) — "Not summarized" + quiet "Summarize now" → /summarize. +// 3. Queued (SummarizeRequested) — "Queued · summarizing shortly"; no button. +// 4. Rate-limited — "In queue" + quiet "Summarize" → /retry-now. +// 5. Pending (else) — "Not summarized" + quiet "Summarize" → /summarize. // -// States 4 and 5 use one verb ("Summarize now") and one style (.btn-quiet); the +// States 4 and 5 use one verb ("Summarize") and one style (.btn-quiet); the // backend side-effect difference (clear-backoff vs. set-flag) is invisible to users. func VideoCard(r store.SummaryRow) templ.Component { return templruntime.GeneratedTemplate(func(templ_7745c5c3_Input templruntime.GeneratedComponentInput) (templ_7745c5c3_Err error) { diff --git a/internal/web/welcome_test.go b/internal/web/welcome_test.go index 270f2bf..3cefb09 100644 --- a/internal/web/welcome_test.go +++ b/internal/web/welcome_test.go @@ -53,6 +53,11 @@ func TestWelcomeLoggedOut(t *testing.T) { require.Contains(t, html, "Get Started", "logged-out CTA present") require.Contains(t, html, `href="/auth/login"`, "CTA links into the Dex flow") require.NotContains(t, html, "Go to my Tapir", "no logged-in controls") + // Invites are owned by Authentik now (ADR-019); Tapir no longer handles + // invite links. The old "invite link will set up your account automatically" + // promise is stale and misleading — it must be gone. + require.NotContains(t, html, "invite link", "stale Authentik-superseded invite copy must be removed") + require.Contains(t, html, "invite-only", "honest invite-only framing present") } func TestWelcomeLoggedIn(t *testing.T) {