Skip to content

feat: convert anonymous users on the extension new-tab hijacking strip#6127

Open
tsahimatsliah wants to merge 21 commits into
mainfrom
feat/hijacking-strip-conversion
Open

feat: convert anonymous users on the extension new-tab hijacking strip#6127
tsahimatsliah wants to merge 21 commits into
mainfrom
feat/hijacking-strip-conversion

Conversation

@tsahimatsliah
Copy link
Copy Markdown
Member

@tsahimatsliah tsahimatsliah commented Jun 1, 2026

Summary

The /hijacking new-tab override page (served by the browser extension) gets ~70k unique users/day, the bulk of them anonymous. The existing HijackingLoginStrip only offered "Log in to continue" — copy that assumes an existing account and gives anonymous users no reason to register.

This reworks the strip into a signup-first conversion surface:

  • Primary CTA "Sign up — it's free" (opens registration), with "Log in" demoted to a secondary action for returning users.
  • Concrete value props as a 2×2 benefit grid (feed tuned to your stack, save posts, reading streak, never miss what matters).
  • Social proof + reassurance ("Trusted by 1M+ developers", "No credit card. Free forever.").
  • Onboarding path preserved for logged-in-but-not-onboarded users.
  • Analytics: impression log on mount + split SignupButton/LoginButton click events to measure conversion on this high-traffic surface.

Keeps the existing gradient-border / glow / cat visual language.

Test plan

  • pnpm --filter extension exec jest src/newtab/HijackingLoginStrip.spec.tsx
  • Strict typecheck + ESLint clean
  • Manually verify the new-tab strip for anonymous and not-onboarded users in the built extension

Made with Cursor

Preview domain

https://feat-hijacking-strip-conversion.preview.app.daily.dev

@vercel
Copy link
Copy Markdown

vercel Bot commented Jun 1, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
daily-webapp Ready Ready Preview Jun 2, 2026 7:51pm
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
storybook Ignored Ignored Jun 2, 2026 7:51pm

Request Review

Redesign the hijacking new-tab cover into a centered welcome-back card:
returning users with a remembered account get an avatar, provider badge,
and a one-tap "Continue as {name}"; logged-out new users get a clear
"sign you in" message with explicit Sign up / Log in actions. The feed
(promo ad + first stories) still renders below.

Co-authored-by: Cursor <cursoragent@cursor.com>
tsahimatsliah and others added 5 commits June 1, 2026 22:00
Layer depth onto the hijacking new-tab cover: cabbage/onion brand wash,
accent glows, dotted texture, top sheen, and an inset edge over the
existing gradient frame. Elevate content with a brand eyebrow, gradient
accent headlines, a glowing avatar/logo, and lifting cabbage-glow CTAs.
Force a dark token context so buttons stay legible on the dark panel.

Co-authored-by: Cursor <cursoragent@cursor.com>
Rebuild the hijacking cover around real daily.dev signatures instead of
generic effects: the cloudinaryOnboardingGlow rising from the bottom,
the bacon→cabbage onboarding title gradient, the daily.dev logo lockup,
brand copy voice ("Let's jump back in!", "Continue ➔"), and cabbage-glow
CTAs. Drop the blur orbs, dotted grid, gradient-clip accent, pulsing pill,
and the now-unused top-hero-dots utility.

Co-authored-by: Cursor <cursoragent@cursor.com>
Remove the gradient border frame and the fixed-width bottom glow image.
Replace with a full-width brand "aurora" (cabbage core + onion flanks)
that rises smoothly from the bottom edge — dominant, soft, no hard cut.
Tighten subtitles to two lines for better breathing room.

Co-authored-by: Cursor <cursoragent@cursor.com>
Show a masked preview of the real daily.dev feed (mostUpvotedFeed) beside
the sign-in CTA so logged-out developers see the content they unlock by
signing in. Falls back to the centered layout when feed data is unavailable.

Co-authored-by: Cursor <cursoragent@cursor.com>
Add a slow, seamless auto-scroll to the hero feed-peek rail so the preview
feels alive and continuously updating. Respects prefers-reduced-motion.

Co-authored-by: Cursor <cursoragent@cursor.com>
Replace the single side-rail peek with a full-width wall of the real feed:
multiple columns of live posts scrolling at staggered speeds in alternating
directions, dimmed behind a center spotlight so the sign-in is the focal
"unlock" point. Falls back to the centered layout when feed data is sparse.

Co-authored-by: Cursor <cursoragent@cursor.com>
tsahimatsliah and others added 2 commits June 1, 2026 23:45
Remove the noisy animated feed wall and replace it with a cleaner developer-focused hero, using live feed signals as supporting context instead of background decoration.

Co-authored-by: Cursor <cursoragent@cursor.com>
Move the logged-out hero away from status chips toward a calmer editorial layout with a live briefing card, softer background treatment, and more mature daily.dev copy while keeping the noisy feed grid removed.

Co-authored-by: Cursor <cursoragent@cursor.com>
tsahimatsliah and others added 2 commits June 1, 2026 23:57
Remove the live feed stats from the logged-out hero, use the existing cat artwork as the supporting visual, remove the logo capsule, and place signup/login actions side by side.

Co-authored-by: Cursor <cursoragent@cursor.com>
Give the logged-out hero a stronger daily.dev stage treatment with layered brand gradients, a brighter horizon glow, a larger cat visual, and a more prominent gradient CTA while keeping the feed grid removed.

Co-authored-by: Cursor <cursoragent@cursor.com>
Remove the cat shadow treatment and benefit chips, then update the logged-out hero headline and supporting copy to make the developer briefing value more explicit.

Co-authored-by: Cursor <cursoragent@cursor.com>
Remove the eyebrow copy and stop forcing the logged-out hero primary CTA to use a custom gradient so it follows the shared primary button styling across themes.

Co-authored-by: Cursor <cursoragent@cursor.com>
Avoid logging logged-out signup impressions before remembered account storage has loaded, so returning users are attributed to the login CTA. Include the hero alignment/title refinements and regression coverage for the async sign-back path.

Co-authored-by: Cursor <cursoragent@cursor.com>
Preserve the existing cat-stage hero as one variation and add an onboarding-signup-inspired variation using the main signup background treatment for the logged-out hijacking cover.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
@tsahimatsliah
Copy link
Copy Markdown
Member Author

@claude review the pr and make sure all green

@claude
Copy link
Copy Markdown
Contributor

claude Bot commented Jun 2, 2026

Claude finished @tsahimatsliah's task in 3m 18s —— View job


PR Review

  • Check CI status
  • Read changed files
  • Verify scope: no unrelated changes
  • Provide review feedback

CI status

Check Result
ci/circleci: test_extension ✅ pass (all 6 HijackingLoginStrip tests pass)
ci/circleci: typecheck_strict_changed ✅ pass
ci/circleci: lint_shared ✅ pass
ci/circleci: test_shared ✅ pass
ci/circleci: build_extension ✅ pass
ci/circleci: test_webapp 1 failing test
build (umbrella) ❌ fails because of test_webapp
Vercel preview ✅ deployed

The single failing test is PostPage.tsx › should show source name (searches DOM for Towards Data Science, finds the spotlight search header instead). This file is not touched by this PR (which only modifies packages/extension/src/newtab/HijackingLoginStrip.{tsx,spec.tsx} and packages/shared/src/styles/base.css). It's almost certainly a flaky/timing-related failure unrelated to the change — recommend re-running test_webapp on CircleCI to confirm. If it reproduces deterministically on rebase from main, it's a pre-existing issue, not something this PR needs to fix.


Code review

🔴 Dead code: the catStage variation is unreachable

signinHeroVariation is hardcoded as a module-level const, not wired to a feature flag or prop:

// packages/extension/src/newtab/HijackingLoginStrip.tsx:38-40
type SigninHeroVariation = 'catStage' | 'onboardingSignup';
const signinHeroVariation: SigninHeroVariation = 'onboardingSignup';

That means everything in the catStage branch is dead code:

  • CatStageHero (L109-147) — ~40 lines, never selected
  • HeroActionButtons (L81-107) — only used by CatStageHero
  • CatHeroImage (L57-67) — only used by CatStageHero
  • The SigninHeroVariation type + SigninHeroVariationMap (L37-40, L214-220) — single-entry map of a constant
  • cloudinaryReadingReminderCat import (L30) — only referenced from CatHeroImage
  • .top-hero-stage in base.css (L1097-1130 added) — 34 lines of unused CSS

CLAUDE.md is explicit: "Delete dead code — Remove unused components, functions, exports, and files. Don't leave code 'for later'". Either:

  • Wire this to a real feature flag via useConditionalFeature (matches the A/B framing in the PR description), or
  • Delete the catStage branch entirely and inline OnboardingSignupHero as the only signin hero — this is the simpler call given there's no flag scaffolding here today.

Fix this →

🟡 Analytics target type is misleading for two of the three variants

// L278-281
target_type: variant === 'signin' ? TargetType.SignupButton : TargetType.LoginButton,
  • For variant === 'onboarding' (logged-in-but-not-onboarded), the only CTA is Continue ➔ to /onboarding. Logging this as LoginButton (both for impression at L279 and click at L341) will conflate it with actual login interactions in your dashboards.
  • For variant === 'continue' (sign-back, anonymous), the primary CTA is Continue as {firstName} (a re-login), so LoginButton is correct. But the page also has a secondary "Create an account" link that fires the click with SignupButton (L398, via onSignupClick) — meanwhile the impression for this view is logged as LoginButton. That's defensible, but the funnel report will show signup clicks under "login impression" rows. Consider whether the PR's goal of "measure conversion on this high-traffic surface" needs a third TargetType (or a richer target_id like hijacking_onboarding / hijacking_signin / hijacking_continue) so the three variants don't all collapse into two labels.

🟡 formRef cast loses type safety

// L227-229
const authFormRef = useRef<HTMLFormElement>(
  null,
) as unknown as AuthOptionsProps['formRef'];

The double cast through unknown is a workaround for MutableRefObject<HTMLFormElement> vs RefObject<HTMLFormElement | null> incompatibility. If AuthOptionsProps['formRef'] actually accepts a nullable ref, you can drop the cast; if not, the cleaner fix is useRef<HTMLFormElement | null>(null) and adjust the type, but this is package-API-dependent. Low-priority cleanup, but worth a follow-up.

🟢 Tests

The spec is well-structured and covers all four variant paths (signup hero, impression timing, welcome-back, onboarding-link). The AuthOptions mock cleanly exercises the onAuthStateUpdate callback path. Good coverage for what's behaviorally observable.

🟢 CSS

The new .top-hero-aurora rule reads cleanly and uses theme tokens via color-mix(...) correctly. As noted above, .top-hero-stage should be removed alongside the dead CatStageHero.


Summary

  • ✅ Extension tests, typecheck, lint, build, and shared tests all pass.
  • ❌ One test_webapp failure (PostPage.tsx › should show source name) is in a file untouched by this PR — recommend re-running CircleCI to confirm flake.
  • 🔴 Main code-level finding: the catStage hero variation is unreachable dead code (component, helpers, import, and CSS). Either gate it on a real feature flag or delete it per CLAUDE.md.
  • 🟡 Analytics: the onboarding variant logs LoginButton for what is actually an onboarding-continue CTA — worth clarifying the target type semantics.
    · feat/hijacking-strip-conversion

tsahimatsliah added a commit that referenced this pull request Jun 3, 2026
Add a signup-first conversion banner above the feed on topic pages, aimed at
the high-traffic logged-out SEO/AEO landings (mirrors the new-tab hijacking
strip from #6127): a tag-contextual headline, concrete value props (feed
tuned to your stack, save posts, upvote & discuss, never miss what matters),
a primary "Sign up — it's free" CTA with "Log in" secondary, and
free-forever reassurance. Renders only for logged-out users and logs
impression + click events to measure conversion.

Co-Authored-By: Claude Opus 4.8 <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