fix(web): correct stale welcome-page invite copy

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) <noreply@anthropic.com>
This commit is contained in:
2026-06-08 13:43:32 +02:00
co-authored by Claude Opus 4.8
parent a1a5217d77
commit 9bf1c31605
3 changed files with 11 additions and 6 deletions
+1 -1
View File
@@ -84,7 +84,7 @@ templ WelcomePage(user User, loggedIn bool) {
<div class="welcome-cta">
<a class="btn btn-lg" href="/auth/login">Get Started</a>
</div>
<p class="welcome-sub">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.</p>
<p class="welcome-sub">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.</p>
}
</section>
}
+5 -5
View File
@@ -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, "<h1 class=\"welcome-title\">Watch less, know more</h1><p class=\"welcome-tagline\">Tapir summarizes the videos your subscriptions publish, so you can skim the gist and decide what is worth your time.</p><div class=\"welcome-cta\"><a class=\"btn btn-lg\" href=\"/auth/login\">Get Started</a></div><p class=\"welcome-sub\">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.</p>")
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 15, "<h1 class=\"welcome-title\">Watch less, know more</h1><p class=\"welcome-tagline\">Tapir summarizes the videos your subscriptions publish, so you can skim the gist and decide what is worth your time.</p><div class=\"welcome-cta\"><a class=\"btn btn-lg\" href=\"/auth/login\">Get Started</a></div><p class=\"welcome-sub\">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.</p>")
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) {
+5
View File
@@ -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) {