Components Registry
Flat reference for every component, hook, module, and Edge Function across the
Surfc codebase. Use this page when you need to answer “what is X and where does
it live” without grepping. Categories below are organisational only — within a
category, rows are loosely ordered from foundational to leaf.
Convention. If a component is named in surfc/CLAUDE.md
or surfc-web/CLAUDE.md,
it must have a row here. When you add a new entity to either CLAUDE.md, add the row
in the same PR.
Sibling docs.
Hooks have their own page with Returns and Used by columns —
see React Hooks Registry. The encryption story is
in End-to-End Encryption Architecture.
PWA — Root & layout
| Component | Repo | Path | Purpose |
|---|
App | surfc | src/App.jsx | Root component. Wires state hooks, owns the declarative react-router-dom route tree, renders shell layout and overlays. Partial refactor in progress (SUR-303). |
AppGates | surfc | src/components/AppGates.jsx | Sequential gate ladder: encryption check → passkey enrolment → unlock → migration → device-add/transfer. Renders the appropriate gate screen or children when all gates clear. |
ShellNavigation | surfc | src/components/ShellNavigation.jsx | Exports ShellTabRow (desktop/tablet top nav) and ShellBottomNav (mobile bottom nav). ShellBottomNav hides on immersive screens (/, /capture, /note). |
UnsyncedChangesModal | surfc | src/components/UnsyncedChangesModal.jsx | Styled modal for sign-out with unsynced changes; replaces window.confirm. Mounted outside <Routes> so gate screens can render it too. |
PWA — Auth & account
| Component | Repo | Path | Purpose |
|---|
AuthScreen | surfc | src/AuthScreen.jsx | Signed-out login shell — one landing for every entry point (SUR-711 retired the ?intent=signup signup framing). Still consumes ?open_email=1 (UpgradeAuthGate deep-link) to pre-open the email sheet. Fires unified auth_landing_viewed { intent: 'signin' } event; the app_signup_started anchor was removed. |
AuthControls | surfc | src/components/AuthControls.jsx | Shared OAuth + email-OTP primitives extracted from AuthScreen (SUR-370). Optional host overrides (sheetTitle, secondaryLabel, onCtaClick) let UpgradeAuthGate compose it. |
UpgradeRoute | surfc | src/pages/UpgradeRoute.jsx | /upgrade entry point. Sends signed-in users to Stripe Checkout; sends signed-out users to UpgradeAuthGate. Reads ?interval and ?ref from the URL. |
UpgradeAuthGate | surfc | src/pages/UpgradeAuthGate.jsx | Intermediate page for signed-out /upgrade visitors. Inline <AuthControls /> composition (SUR-357). Persists upgrade intent to sessionStorage. |
UpgradeSuccessRoute | surfc | src/pages/UpgradeSuccessRoute.jsx | /upgrade/success post-Stripe redirect. Calls refreshEntitlements() so the UI flips to Pro without a sign-in cycle (SUR-345). |
SettingsBridge | surfc | src/pages/SettingsBridge.jsx | /settings redirect shim. Navigates to /profile and programmatically opens the Settings modal. Catches /.well-known/change-password redirects too. |
PolicyPage | surfc | src/pages/PolicyPage.jsx | Renders Termly-hosted policy documents inside the SPA shell via useTermlyEmbed. Reached at /policies/:kind (privacy, terms). |
ProfileScreen | surfc | src/components/ProfileScreen.jsx | User profile + tier display. Member-since date, tier badge, account name/email. Links to help.surfc.app and policy pages. |
DeleteAccountModal | surfc | src/components/DeleteAccountModal.jsx | Permanent account deletion confirmation. Pre-deletes notes/books/ideas client-side, then calls the delete-account Edge Function. |
PWA — Screens & views
| Component | Repo | Path | Purpose |
|---|
HomeScreen | surfc | src/components/HomeScreen.jsx | Dashboard landing. Note/idea/source counts, week summary, recently surfaced note, quick-jump stats. Composes HomeHero. |
HomeHero | surfc | src/components/HomeHero.jsx | Hero section shared between AuthScreen and HomeScreen. Brand tagline + signup/signin framing. |
CaptureScreen | surfc | src/components/CaptureScreen.jsx | Camera viewfinder for note capture. Hosts CameraViewfinder; mobile-first immersive layout. |
IndexScreen | surfc | src/components/IndexScreen.jsx | Your Commonplace — the Idea Tree (default) + flat note list, view-mode-driven by URL (?view=tree|flat, ?slide=). Note cards, filtering, long-press surface. Mounted at /commonplace (renamed from /index, SUR-493). |
CustomIdeasScreen | surfc | src/components/CustomIdeasScreen.jsx | User’s custom-created ideas — add / edit / delete / description flows. Reached from Settings → “Manage your custom ideas” (SUR-493); browsing also lives on the Tree’s Ideas You Bring slide. |
IdeaDetail | surfc | src/components/IdeaDetail.jsx | Single-idea detail. Shows notes tagged to the idea. |
Library | surfc | src/components/Library.jsx | Book / source management. List, add, edit, delete. Drives note filtering by source. |
RelatedNotesScreen | surfc | src/components/RelatedNotesScreen.jsx | Notes related to the current context (same source, same idea). Driven by route params. |
SourcesScreen | surfc | src/components/SourcesScreen.jsx | Aggregated view of all sources/books, grouped by author with note counts. |
HelpCenterScreen | surfc | src/components/HelpCenterScreen.jsx | In-app help index at /help. Searchable list of articles from src/help/manifest.js. Fires help_index_opened. |
HelpArticle | surfc | src/components/HelpArticle.jsx | In-app article renderer at /help/:slug. Passes markdown body to HelpArticleBody. Fires help_article_viewed. |
HelpArticleBody | surfc | src/components/HelpArticleBody.jsx | Markdown renderer (react-markdown + remark-gfm + remark-directive + callout plugin). Rewrites VitePress paths to SPA /help/:slug. |
HelpCallout | surfc | src/components/HelpCallout.jsx | Callout / admonition component (Note, Tip, Warning, Danger). Used by HelpArticleBody. |
| Component | Repo | Path | Purpose |
|---|
NoteForm | surfc | src/components/NoteForm.jsx | Note creation/edit form. Image capture, text input, idea tagging via AddIdeaSheet, transcription, save. Central capture UX. |
NoteEditForm | surfc | src/components/NoteEditForm.jsx | Dedicated edit form for existing notes. Text/tags/image updates; triggers rediscovery and re-encryption. |
NoteActionOverlay | surfc | src/components/NoteActionOverlay.jsx | Long-press note action flow (action sheet → full-edit or source-edit). Exposed via forwardRef; App.jsx calls ref.current.open(note). |
NoteActionSheet | surfc | src/components/NoteActionSheet.jsx | Bottom sheet for note actions (delete, tag, view image). Rendered by NoteActionOverlay. |
NoteCard | surfc | src/components/NoteCard.jsx | Individual note card in grid/list view. Preview text, image thumbnail, tags, source badge. Long-press to NoteActionOverlay. |
NoteDetailOverlay | surfc | src/components/NoteDetailOverlay.jsx | Full-screen note detail. Read-only preview of text, tags, image, source with lightbox integration. |
PiiReviewSheet | surfc | src/components/PiiReviewSheet.jsx | Bottom sheet for PII detection review before managed-AI submission. Shows matches; allows redact/edit/send-anyway. |
AddIdeaSheet | surfc | src/components/AddIdeaSheet.jsx | Bottom sheet for searching/adding ideas during note capture. Renders canon + custom ideas with live search and “Create” CTA. |
AddIdeaBanner | surfc | src/components/AddIdeaBanner.jsx | Post-creation banner prompting description entry for newly created custom ideas. Dismissal local-state only. |
IdeaEditForm | surfc | src/components/IdeaEditForm.jsx | Form for editing existing custom idea (name, description). Soft validation; updates via saveCustomIdea. |
IdeaActionOverlay | surfc | src/components/IdeaActionOverlay.jsx | Long-press idea action flow (action sheet → edit). Exposed via forwardRef; fires onActiveChange so IdeasSidebar syncs. |
IdeaActionSheet | surfc | src/components/IdeaActionSheet.jsx | Bottom sheet for idea actions (edit, delete, view notes). |
| Component | Repo | Path | Purpose |
|---|
IdeasSidebar | surfc | src/components/IdeasSidebar.jsx | Persistent idea browser for desktop/tablet. Toggles on mobile. Syncs selected idea state with the main view. |
RecentlySurfaced | surfc | src/components/RecentlySurfaced.jsx | Mini widget showing recently reviewed notes on HomeScreen. |
CameraViewfinder | surfc | src/components/CameraViewfinder.jsx | Camera stream viewfinder canvas for CaptureScreen. Handles permission, stream setup, frame capture. |
ContextualHelpLink | surfc | src/components/ContextualHelpLink.jsx | Inline ? icon linking to in-app help article or help.surfc.app fallback. |
AvatarButton | surfc | src/components/AvatarButton.jsx | User avatar + initials button in nav chrome. Opens menu or navigates to profile. |
BottomSheet | surfc | src/components/BottomSheet.jsx | Reusable accessible bottom-sheet primitive used throughout for modals/pickers/action flows. |
PWA — Settings & device management
| Component | Repo | Path | Purpose |
|---|
SettingsModal | surfc | src/components/SettingsModal.jsx | App-settings modal (custom ideas, import/export, data/cache management). Drives useSettings. |
LinkedDevicesModal | surfc | src/components/LinkedDevicesModal.jsx | (SUR-233) Device manager UI for the key lifecycle. Lists active prf-v1 blobs with device label, enrolment date, “This device” badge. Inline removal with last-device guard. |
PWA — Encryption & crypto components
| Component | Repo | Path | Purpose |
|---|
PasskeyEnrollmentScreen | surfc | src/components/PasskeyEnrollmentScreen.jsx | Guides initial passkey registration. Calls registerEncryptionPasskey(); uploads wrapped blob to Supabase. Rendered by the gate ladder. |
UnlockScreen | surfc | src/components/UnlockScreen.jsx | Asks the user to unlock their Master Key via passkey assertion. Calls getEncryptionPrfOutput(); derives wrapping key; unwraps MK. |
EncryptionMigrationModal | surfc | src/components/EncryptionMigrationModal.jsx | One-time migration from legacy PRF-derived key to Master Key architecture. Re-encrypts the corpus when legacy notes are detected. |
PWA — Crypto module (stateless pure functions)
See End-to-End Encryption Architecture for the full
narrative; this table is the address book.
| Component | Repo | Path | Purpose |
|---|
keyManager | surfc | src/crypto/keyManager.js | Master Key lifecycle: generate, wrap/unwrap (PRF and PIN), re-wrap for multi-device. Holds module-level non-extractable CryptoKey. Never extracted. |
noteEncryption | surfc | src/crypto/noteEncryption.js | Stateless AES-GCM-256 encrypt/decrypt for note text. Two formats: enc:v1 (no AAD, legacy) and enc:v2 (AAD = noteId, current). |
passkeyEnrollment | surfc | src/crypto/passkeyEnrollment.js | All navigator.credentials calls. Registers platform passkey with WebAuthn PRF extension. Returns PRF output as raw ArrayBuffer. |
deviceTransfer | surfc | src/crypto/deviceTransfer.js | PIN-based MK transfer between devices. Working device wraps with 6-digit PIN (PBKDF2 600k); new device redeems. 60 s TTL enforced server-side. |
PWA — Hooks
See React Hooks Registry for the full table with
Returns and Used by columns. The hook files are:
| Hook | Repo | Path |
|---|
useAuth | surfc | src/hooks/useAuth.js |
useKeyManagement | surfc | src/hooks/useKeyManagement.js |
useUpgradeResumption | surfc | src/hooks/useUpgradeResumption.js |
useUI | surfc | src/hooks/useUI.js |
useToast | surfc | src/hooks/useToast.js |
useMediaQuery | surfc | src/hooks/useMediaQuery.js |
useFocusRestore | surfc | src/hooks/useFocusRestore.js |
useNoteActions | surfc | src/hooks/useNoteActions.js |
useNoteForm | surfc | src/hooks/useNoteForm.js |
useSettings | surfc | src/hooks/useSettings.js |
useAnalytics | surfc | src/hooks/useAnalytics.js |
useEntitlements | surfc | src/hooks/useEntitlements.js |
useUserProfile | surfc | src/hooks/useUserProfile.js |
useCameraStream | surfc | src/hooks/useCameraStream.js |
useLongPress | surfc | src/hooks/useLongPress.js |
useTurnstile | surfc | src/hooks/useTurnstile.js |
useTermlyEmbed | surfc | src/hooks/useTermlyEmbed.js |
PWA — Dexie & storage
| Component | Repo | Path | Purpose |
|---|
db | surfc | src/db.js | Dexie IndexedDB schema and all local CRUD (saveBook, saveNote, saveCustomIdea, deleteNote, etc.), version migrations, outbox queue, export/import. Single source of truth offline. |
PWA — Cloud & API
| Component | Repo | Path | Purpose |
|---|
supabase | surfc | src/supabase.js | Supabase client and all cloud operations: auth (Google + email-OTP), CRUD, image storage, sync fetch, cross-domain auth-cookie mirror. Wraps supabase-js. |
api | surfc | src/api.js | Anthropic API calls (legacy BYOK path — sunset SUR-91). Direct calls to Claude for transcription/discovery; managed path goes through anthropic-proxy. |
PWA — Utilities & helpers
| Component | Repo | Path | Purpose |
|---|
constants | surfc | src/constants.js | The Idea Canon (Adler 102 ideas). Imported by anthropic-proxy/prompts.ts via Deno cross-tree import — must remain Vite/build-tool neutral. |
createCustomIdea | surfc | src/lib/createCustomIdea.js | Shared deduped custom-idea creation: collision-checks via findCanonicalIdeaName, writes Dexie + Supabase. Used by ProfileScreen and AddIdeaSheet. |
deviceLabel | surfc | src/utils/deviceLabel.js | Pure UA parser: getDeviceLabel(userAgent, hasTouch) → "Platform · Browser". Captured at passkey-enrolment time. |
utmParams | surfc | src/lib/utmParams.js | Pure readUtmParams(search). Parses query string; returns { utm_source, utm_medium, utm_campaign, utm_term, utm_content, gclid, fbclid }. Used by AuthScreen + UpgradeAuthGate. |
upgradeIntent | surfc | src/lib/upgradeIntent.js | Helpers for upgrade-flow intent persistence (sessionStorage). Written by UpgradeAuthGate; read by useUpgradeResumption. |
freshSignup | surfc | src/lib/freshSignup.js | Detects fresh signup via browser local state. Drives onboarding gate show/hide. |
platform | surfc | src/lib/platform.js | Platform detection helpers. isStandaloneOrTwa() checks for PWA/TWA contexts. Used by AuthScreen to alter login framing. |
webVitalsToPostHog | surfc | src/lib/webVitalsToPostHog.js | Bridges the web-vitals library to PostHog. Records LCP/FID/CLS metrics as events. |
PWA — Ingest & data processing
| Component | Repo | Path | Purpose |
|---|
ingest | surfc | src/ingest/index.js | Main export. Orchestrates photoAdapter and manualAdapter; normalises raw input into note shape. |
photoAdapter | surfc | src/ingest/photoAdapter.js | Converts photo + transcription (managed/BYOK) into note objects. Handles source metadata. |
manualAdapter | surfc | src/ingest/manualAdapter.js | Converts manual text input into note objects. Minimal processing; used for keyboard-entry notes. |
PWA — Safety & guardrails
| Component | Repo | Path | Purpose |
|---|
safety | surfc | src/safety/index.js | Client-side safety orchestrator. Runs checkStructuredPii before managed-AI calls. Warn-not-block via the PiiReviewSheet. Stub seams for SUR-246. |
piiRegex | surfc | src/safety/piiRegex.js | Structured-PII regex detection: credit cards (Luhn), IBANs (mod-97), phone numbers (E.164/US/GB), emails, UK NINs, US SSNs. Stateless. |
PWA — Help system
| Component | Repo | Path | Purpose |
|---|
manifest | surfc | src/help/manifest.js | Reads docs/getting-started/*.md at Vite build time via import.meta.glob. Exports articles, indexArticle, getArticle(slug), isForwardReference(slug). |
calloutPlugin | surfc | src/help/calloutPlugin.js | Remark plugin transforming :::note/:::tip/:::warning/:::danger into HelpCallout AST nodes. |
normaliseContainers | surfc | src/help/normaliseContainers.js | Normalises container element wrappers from remark-directive before the callout plugin processes them. |
Edge Functions (Supabase / Deno)
| Component | Repo | Path | Purpose |
|---|
anthropic-proxy | surfc | supabase/functions/anthropic-proxy/ | Proxies managed Anthropic calls (transcribe, discover). Runs guardrails (Prompt Shields, harm moderation, spotlighting). Records ai_usage_daily. Enforces per-user quotas. Fail-open on Azure outage. |
anthropic-proxy/guardrail.ts | surfc | supabase/functions/anthropic-proxy/guardrail.ts | Azure AI Content Safety integration. shield() (Prompt Shields + Spotlighting) and moderate() (harm classifiers, threshold ≥5). Fail-open on Azure outage. |
anthropic-proxy/prompts.ts | surfc | supabase/functions/anthropic-proxy/prompts.ts | Single source of truth for managed-AI system prompts. TRANSCRIBE_SYSTEM, TRANSCRIBE_SYSTEM_ASCII_NOTE, buildDiscoverSystem(customIdeas). Imports GREAT_IDEAS from src/constants.js. |
delete-account | surfc | supabase/functions/delete-account/ | Permanently deletes the authenticated user’s account. Service-role Supabase client to nuke ai_usage_daily rows and the auth.users record. |
approve-waitlist | surfc | supabase/functions/approve-waitlist/ | Legacy admin-UI approval path. Upserts waitlist_requests with approval status. Retirement tracked SUR-369. |
waitlist-signup | surfc | supabase/functions/waitlist-signup/ | Sunset SUR-367. Historically posted to from the marketing site; clients now hit /auth/v1/signup directly. Kept for reference / rollback. |
me-entitlements | surfc | supabase/functions/me-entitlements/ | Exposes the resolved Entitlements shape (SSoT from _shared/entitlements.ts) for the authenticated user. Called by useEntitlements. |
image-upload | surfc | supabase/functions/image-upload/ | Note-image uploads. Increments user_profiles.image_storage_bytes_used atomically via adjust_image_storage_bytes RPC. Respects tier storage limits. |
create-checkout-session | surfc | supabase/functions/create-checkout-session/ | Creates a Stripe Checkout session for Pro tier upgrade. Upserts stripe_customer_id; sets subscription_data.metadata.user_id for webhook fallback. |
create-billing-portal-session | surfc | supabase/functions/create-billing-portal-session/ | Creates a Stripe Customer Portal session for subscription management. |
stripe-webhook | surfc | supabase/functions/stripe-webhook/ | Handles Stripe webhook events (subscription.created/updated/deleted, invoice.paid). Updates user_profiles tier. Idempotent via stripe_webhook_events ledger. Self-heal fallback on customer-id mismatch. |
Edge Functions — shared
| Component | Repo | Path | Purpose |
|---|
entitlements | surfc | supabase/functions/_shared/entitlements.ts | Single source of truth for Entitlements shape and tier defaults (FREE_DEFAULTS, PRO_DEFAULTS). getResolvedEntitlements(row) resolver. |
Marketing — surfc-web components
| Component | Repo | Path | Purpose |
|---|
BaseLayout | surfc-web | src/layouts/BaseLayout.astro | Shared head (meta, fonts, Termly, PostHog init) and body chrome. Props: title, description, ogImage, path, noindex, nofollow, bodyClass, bodyData. |
BlogPostLayout | surfc-web | src/layouts/BlogPostLayout.astro | Template for /blog/[slug].astro posts. Extends BaseLayout; renders TOC, article body, publication metadata, reading time. |
Nav | surfc-web | src/components/Nav.astro | Top navigation. Links to /, /pricing, /blog, sign-in/sign-up CTAs. data-cta values for analytics. UTM-preserving via preserveUtm.ts. |
Hero | surfc-web | src/components/Hero.astro | Landing hero. Brand tagline + sign-up / sign-in CTAs. Shared HomeHero styles. |
PulledQuote | surfc-web | src/components/PulledQuote.astro | Typographic pull-quote section drawn from the Syntopicon philosophy. |
WhatSurfcIs | surfc-web | src/components/WhatSurfcIs.astro | Feature/benefit overview (“Offline-first”, “End-to-end encrypted”, “AI-assisted tagging”). |
CapturePassages | surfc-web | src/components/CapturePassages.astro | Feature showcase with mockup (“Photograph passages and handwritten notes”). |
TagIdeas | surfc-web | src/components/TagIdeas.astro | Feature showcase (“Tag to 102 canonical ideas or your own”). |
SupportingCards | surfc-web | src/components/SupportingCards.astro | Three-column feature cards (Fast / Secure / Personal). |
Testimonials | surfc-web | src/components/Testimonials.astro | User testimonial carousel/grid. |
CapturePhoneMockup | surfc-web | src/components/CapturePhoneMockup.astro | iPhone mockup used in feature sections. |
Faq | surfc-web | src/components/Faq.astro | Frequently asked questions accordion. |
PricingFaq | surfc-web | src/components/PricingFaq.astro | Pricing-specific FAQ. |
PricingTiers | surfc-web | src/components/PricingTiers.astro | Free and Pro tier cards. Price strings duplicated with surfc/src/pages/UpgradeAuthGate.jsx (PRICE_COPY); cross-repo grep before editing. |
ClosingCta | surfc-web | src/components/ClosingCta.astro | Final call-to-action section + sign-up CTA. |
Footer | surfc-web | src/components/Footer.astro | Site footer. Links to policies, blog, social, copyright. |
AuthorCard | surfc-web | src/components/AuthorCard.astro | Blog post author byline card (avatar, name, bio). |
TableOfContents | surfc-web | src/components/TableOfContents.astro | Sticky TOC for blog posts. rehype-autolink-headings integration. |
Marketing — surfc-web content & config
| Component | Repo | Path | Purpose |
|---|
content.config.ts | surfc-web | src/content.config.ts | Astro content-collection schema for blog posts (Zod). Fields: title, description, pubDate, author, tags, heroImage, draft. |
| Blog index | surfc-web | src/pages/blog/index.astro | Paginated blog listing with metadata. |
Blog [slug] | surfc-web | src/pages/blog/[slug].astro | Individual post renderer. Passes body to BlogPostLayout; integrates MDX. |
| RSS feed | surfc-web | src/pages/blog/rss.xml.js | RSS feed for all published blog posts. |
remark-reading-time | surfc-web | src/plugins/remark-reading-time.mjs | Remark plugin injecting estimated reading time into frontmatter (SUR-256). |
| Landing | surfc-web | src/pages/index.astro | / route. Composes Nav, Hero, PulledQuote, WhatSurfcIs, CapturePassages, TagIdeas, SupportingCards, Testimonials, Faq, ClosingCta, Footer. |
| Pricing | surfc-web | src/pages/pricing.astro | /pricing route. PricingHero, PricingTiers, PricingFaq. UTM preservation, Stripe Checkout integration. |
| Waitlist redirect | surfc-web | src/pages/waitlist.astro | /waitlist sunset page. Friendly “we’ve opened up” + 3 s meta http-equiv="refresh" to app.surfc.app. noindex. |
| Privacy policy | surfc-web | src/pages/policies/privacy.astro | /policies/privacy. Termly embed. |
| Terms policy | surfc-web | src/pages/policies/terms.astro | /policies/terms. Termly embed. |
Marketing — surfc-web utilities
| Component | Repo | Path | Purpose |
|---|
auth | surfc-web | src/lib/auth.ts | Reads cross-domain access token from the sb-surfc-access cookie (set by surfc/src/supabase.js). Returns JWT for Stripe calls. |
appUrl | surfc-web | src/lib/appUrl.ts | Shared signupUrl() helper. Returns ${appUrl}/signin for deep-linking past the auth redirect (SUR-711 dropped the ?intent=signup param). |
checkout | surfc-web | src/lib/checkout.ts | Stripe Checkout integration. Calls create-checkout-session Edge Function. |
preserveUtm | surfc-web | src/scripts/preserveUtm.ts | Forwards UTM params from the marketing page onto every <a data-cta> cross-domain href. Re-attaches on astro:page-load. Inverse of surfc/src/lib/utmParams.js. |
astro.config | surfc-web | astro.config.mjs | Astro config. MDX + rehype-slug + rehype-autolink-headings + remarkReadingTime. trailingSlash: 'always'. Static output (no adapter). |
.nvmrc | surfc-web | .nvmrc | Pins Node 22; matches engines.node and the Cloudflare Pages runtime (SUR-254). |
Recently sunset
These components have been removed from the codebase but are listed here for
historical reference — older PRs, plan docs, and CLAUDE.md snippets may still
reference them.
| Component | Repo | Removed by | Notes |
|---|
WaitlistForm | surfc-web | SUR-365 (2026-05-10) | Deleted along with tests/waitlist.spec.ts and tests/fixtures/cors-server.mjs. Marketing CTAs now compose signupUrl() from src/lib/appUrl.ts, deep-linking to app.surfc.app/signin (SUR-711 dropped the ?intent=signup param). src/pages/waitlist.astro replaced with a noindex sunset page (3 s meta refresh to app.surfc.app). |
LandingPage | surfc | SUR-215 (2026-04-23) | Marketing surface now lives entirely in surfc-web/. |
WaitlistScreen | surfc | SUR-215 (2026-04-23) | Pre-open-signup waitlist gate (PendingApprovalScreen) was removed alongside in SUR-364 (2026-05-10) when Surfc flipped to direct signup. |
HowItWorksPage | surfc | SUR-215 (2026-04-23) | Replaced by the marketing landing page in surfc-web/. |
Evidence gathered from source files only, per AGENTS.md.