Skip to content

cards-web: honest landing copy, live demo links, ask-the-card create CTA - #153

Open
0xSY3 wants to merge 1 commit into
devfrom
feat/landing-honest-copy
Open

0xSY3 wants to merge 1 commit into
devfrom
feat/landing-honest-copy

Conversation

@0xSY3

@0xSY3 0xSY3 commented Oct 30, 2026

Copy link
Copy Markdown
Member

Fixes the remaining "broken or inconsistent" landing items and adds the ask-the-card CTA from the UX doc. Copy and wiring only. No backend, env or flag changes.

L1: fake founding counter (removed)

cards-api has no endpoint that returns a claimed-card count. GET /cards returns a list of up to 1000 published cards, not a count, and the "/ 25" cap was never real. So the counter is gone, along with the made-up member initials (CK, AR, KD, SB, LN, +12) and the "25 people" framing. The section's layout, badge, copy and CTA stay.

  • "We're building the first layer of the network with 25 people." → "…with people who ship."
  • "Founding Network Status: 17 / 25 spots claimed" plus the initials row → removed
  • "Apply for Founding Network" → "Join the Founding Network" (there is no application step; the button scrolls to create)

L2: demo "Book intro" controls

  • (landing)/page.tsx demo candidates (×2) "📅 Book 20m Intro →": the no-op span.cursor-pointer became a Link to /create?ref=landing_demo
  • (landing)/page.tsx dual-interface "Book Intro" pill (same dead cursor-pointer span, found in the sweep): same link
  • (landing)/hero-card-stack.tsx "📅 Book 20m Intro" → plain muted status text "📅 Open to 20m intros". This one is not a link on purpose: dealt-away cards stay mounted at opacity 0 over the page, so a link there would be an invisible click target.
  • proxy.ts saves ref into the attribution cookie (kept, not edited). These links use prefetch={false} because Proxy also runs on prefetches, so viewport prefetch alone would overwrite a visitor's real campaign ref.

L3: dead links (sweep of landing and footer)

Where Before After
Footer Manifesto → href="#" removed (no manifesto page exists)
Discovery section caption View the Network Layer ↓ → #network (that section was deleted earlier) View the Network Layer → → /directory
Header nav "Synthesize" #ingestion, which is only rendered for signed-out visitors signed-in visitors go to #your-card
Founding CTA #ingestion (same problem) same fix
Dual-interface "Book Intro" pill no-op cursor-pointer see L2

All other in-page anchors (#paradigm, #signals, #discovery, #dual-view, #privacy, #your-card) have matching ids. No onClick handlers were no-ops.

L4: copy honesty (owner /home)

File Before After
home/discovery-analytics.tsx "Who found you · Last 7 days" "Who read your card · Last 7 days"
home/agent-traffic.tsx eyebrow "PROFILE DISCOVERY" "PROFILE READS"
home/agent-traffic.tsx "Which agents visited" "Which agents fetched your card"

The rest of /home already talks in "recorded requests" and "reported client identities". The landing has no measured-number claims of the "recommended you", "queried N times" or "agents are hiring" kind: its demo panels are illustrative, and its FAQ and hero describe capability, not counts. So the landing needed no copy changes for L4. tests/owner-home.spec.ts was updated to the new region name.

L5: ask-the-card CTA

After a visitor's first successful answer, ProfileChatWidget shows one small note under that answer: "Want an AI that answers like this for you? Create your card" → /create?ref=ask_card.

  • It shows once per widget session. It is pinned to the first real answer and is not repeated on later replies.
  • It does not show after error or empty replies.
  • It is hidden for the card's owner and for signed-in viewers who have a card. The page's existing getMyCard result is reused; there are no new fetches.
  • It matches the widget's existing styles (white bubble, #E0E0D8 border, #4f46e5 link).
  • New tests/ask-card-cta.spec.ts (Playwright, chat stubbed with page.route) covers: a visitor sees it once across two answers, a failed answer shows nothing, and a signed-in viewer who has a card sees nothing.

Verification (apps/cards-web)

  • eslint .: 0 errors, 24 warnings (same as before the change)
  • npx tsc --noEmit: clean
  • npx next build --webpack: exit 0
  • next start + curl /: no "17 / 25", "spots claimed", "Manifesto", href="#" or #network. create?ref=landing_demo appears 3 times.
  • Playwright run on port 3048 (webpack dev server) for ask-card-cta, owner-home and smoke: 30 passed, 1 failed. The failure is smoke › directory chips rank people with scores and reasons (92% match img missing). It fails the same way on the unmodified base, so this PR did not cause it.
  • There is no npm test script in cards-web.

Not in scope and not touched: canonical profile URLs, share-controls/og, funnel events, intros, proxy.ts, discover components, create flow, track.ts.

🤖 Generated with Claude Code

… own" from card chat

The landing showed a hard-coded "17 / 25 spots claimed" with invented member
initials; cards-api has no claimed-count endpoint, so the counter and the
25-person framing go rather than keep a number nobody measures. Demo "Book
intro" controls looked clickable but did nothing, and three anchors (#,
#network, and #ingestion for signed-in visitors) scrolled nowhere: each now
goes somewhere real or reads as plain text.

Owner /home said "Who found you" and "Which agents visited" over counts that
are only fetches of the card by self-reported clients, so the copy now says
read/fetched.

After a visitor's first real answer from a card's assistant, the widget shows
one "Want an AI that answers like this for you?" link to /create?ref=ask_card.
The page already knows whether the viewer owns this card or has one of their
own, so both are excluded without a new fetch. Ref links skip prefetch
because proxy.ts records ?ref= on prefetch requests too, which would credit a
source the visitor never clicked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant