Skip to content

chore: remove daily homepage feature - #6476

Merged
capJavert merged 4 commits into
mainfrom
remove-daily-homepage
Aug 13, 2026
Merged

chore: remove daily homepage feature#6476
capJavert merged 4 commits into
mainfrom
remove-daily-homepage

Conversation

@capJavert

@capJavert capJavert commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Removes the daily_page experiment and everything gated behind it:

  • packages/shared/src/features/daily (DailyHome, Cover* sections, DailySwitcher, DailyFeedback, DailyPostVotes, HeadlinesSettingsModal, useDailyFeed, optimisticMutations) and the /daily page
  • the daily_page flag, DailyPageVariant and useDailyPage
  • DAILY_FEED_QUERY, the DailyHeadlines query, the markDailySeen mutation and RequestKey.DailyFeed
  • Origin.DailyPage and LogEvent.DailyFeedback
  • the client-owned daily/setDaily session state from BootProvider, AuthContext and the boot cache
  • the daily-as-default branches in both MainFeedPages, the sidebar entry and the /daily handling in FeedNav

The "For you" chip is no longer suppressed in ExploreChipsBar and UnifiedMobileFeedNav, and ExploreChipsBar drops its onNavTabClick prop, which only existed to wire up the switcher.

/daily now permanently redirects to / so existing links keep working.

Changes

Events

Did you introduce any new tracking events?

Experiment

Did you introduce any new experiments?

Manual Testing

Caution

Please make sure existing components are not breaking/affected by this PR

Preview domain

https://remove-daily-homepage.preview.app.daily.dev

@capJavert capJavert self-assigned this Aug 13, 2026
@vercel

vercel Bot commented Aug 13, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
daily-webapp Ready Ready Preview Aug 13, 2026 2:17pm
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
storybook Ignored Ignored Aug 13, 2026 2:17pm

Request Review

@capJavert

Copy link
Copy Markdown
Contributor Author

@claude review

@claude

claude Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Claude finished @capJavert's task in 4m 10s —— View job


Review: chore: remove daily homepage feature

  • Gather context (diff, changed files)
  • Check for leftover references to removed symbols
  • Review behavioral changes (feed nav, sidebar, boot state, redirect)
  • Post review

Verdict: clean removal, looks good to merge. No blocking issues found. A few optional notes below.


What I verified

Dead-reference sweep — grepped the whole repo (excluding *.md/lockfile) for every removed symbol: DailyHome, useDailyPage, DailySwitcher, DailyPageVariant, featureDailyPage, daily_page, DAILY_FEED_QUERY, DailyHeadlines/dailyHeadlines, markDailySeen, DailyFeedback, DailyPostVotes, Cover*, HeadlinesSettingsModal, useDailyFeed, optimisticMutations, RequestKey.DailyFeed, Origin.DailyPage, setDaily, isDailyAsDefault, features/daily. Zero hits. packages/shared/src/features/daily/ and packages/webapp/pages/daily/ are fully gone (no orphan spec/story files left behind), and no SharedFeedPage/lib/feed.ts enum entry pointed at daily.

Imports that could have gone unused — checked each file where the diff removed the only consumer:

  • graphql/highlights.ts: Connection, ONE_MINUTE, and MAJOR_HEADLINES_MAX_FIRST are all still used by the remaining headline queries — correct to keep Connection/ONE_MINUTE imports and correct that only Post/SHARED_POST_INFO_FRAGMENT were dropped.
  • sidebar/sections/MainSection.tsx: MagicIcon is still used by the v2 "For You" icon (line 73), so keeping the import is right; useConditionalFeature still needed for featureYearInReview.
  • feeds/ExploreChipsBar.tsx: isExtension and SharedFeedPage have no other use in the file — correct to drop both.
  • contexts/BootProvider.tsx: useState/useCallback still used elsewhere.

Boot cachedaily removed from the filteredProps allowlist in updateLocalBootData (BootProvider.tsx:88). Since filteredProps picks rather than omits, the stale daily key gets dropped from BOOT_LOCAL_KEY on the next boot write, so no lingering state for users who were in the experiment. AuthContextProviderProps no longer picks daily/setDaily, and no <AuthContextProvider> call site (companion app, storybook mocks, specs) passed them.

Memo depsMainFeedLayout.tsx:357 drops onNavTabClick, UnifiedMobileFeedNav.tsx drops showDailySwitcher; both dep arrays match their new bodies. MainFeedLayout correctly keeps the onNavTabClick prop since it still consumes it itself for extension tab nav (line 682) — only the pass-through to ExploreChipsBar was removed.

Nav/gatingFeedNav shouldRenderNav/shouldRenderFeedChips no longer special-case /daily, which is right now that the route is gone. Un-gating "For you" in both ExploreChipsBar and UnifiedMobileFeedNav restores the pre-experiment list; the existing logged-out UnifiedMobileFeedNav test still exercises that chip via the "Home" label.


Notes (non-blocking)

1. permanent: true on the /daily redirectpackages/webapp/next.config.ts:198

A 308 is cached by browsers indefinitely, so any user who hits /daily once can't reach that path again until they clear their cache. That's fine for the dead links this is meant to catch, and it matches the neighboring /mobile, /brand, /about entries — but this was an experiment path that could plausibly come back. If there's any chance /daily gets reused, permanent: false (307) avoids poisoning clients.

Fix this →

2. Optional test for the restored "For you" chip — the specs only lost the now-dead mocks; nothing asserts that the chip is back for logged-in users (the logged-out path is covered via "Home"). A one-line expect(screen.getByRole('link', { name: 'For you' })).toBeInTheDocument() in UnifiedMobileFeedNav.spec.tsx would lock in the un-gating.

Fix this →

3. Server-side leftoversdailyFeed, dailyHeadlines, markDailySeen and the boot daily field still exist on the API side. Nothing here depends on them (extra boot fields are ignored), but worth a follow-up ticket on daily-api if it isn't already tracked.


Verification I could not run

Dependencies aren't installed in this environment and pnpm install isn't in my allowed tools, so I could not run pnpm --filter shared test, lint, or node ./scripts/typecheck-strict-changed.js. The review above is static analysis only — CI is the signal for the two touched spec files (ExploreChipsBar.spec.tsx, UnifiedMobileFeedNav.spec.tsx) plus pnpm --filter webapp test for the cross-package DOM assertions that AGENTS.md warns about after shared-component changes.

Also worth a manual pass on the preview: / for a logged-in user (For you chip present, feed renders), /daily (redirects to /), the mobile chips bar, and the sidebar (no "Daily" entry) — in both webapp and extension.
· Branch: remove-daily-homepage

Removes the daily_page experiment and everything gated behind it:

- packages/shared/src/features/daily (DailyHome, Cover* sections,
  DailySwitcher, DailyFeedback, DailyPostVotes, HeadlinesSettingsModal,
  useDailyFeed, optimisticMutations) and the /daily page
- the daily_page flag, DailyPageVariant and useDailyPage
- DAILY_FEED_QUERY, the DailyHeadlines query, the markDailySeen mutation
  and RequestKey.DailyFeed
- Origin.DailyPage and LogEvent.DailyFeedback
- the client-owned `daily`/`setDaily` session state from BootProvider,
  AuthContext and the boot cache
- the daily-as-default branches in both MainFeedPages, the sidebar entry
  and the /daily handling in FeedNav

The "For you" chip is no longer suppressed in ExploreChipsBar and
UnifiedMobileFeedNav, and ExploreChipsBar drops its onNavTabClick prop,
which only existed to wire up the switcher. Both components gained a test
asserting the chip is back for logged-in users.

/daily now temporarily redirects to / so existing links keep working,
without baking a permanent redirect into clients for a path that may
come back.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@capJavert

Copy link
Copy Markdown
Contributor Author

@claude review

@claude

claude Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Claude finished @capJavert's task in 4m 9s —— View job


Review: chore: remove daily homepage feature

  • Gather context (diff, changed files)
  • Dead-reference sweep for removed symbols
  • Transitive-orphan check (code the daily files were the only consumer of)
  • Review behavioral changes (MainFeedPage, feed nav, sidebar, boot state, redirect)
  • Post review

Verdict: clean, complete removal. No blocking issues. One test nit below.

Note: the two suggestions from my earlier pass are already in the pushed commit — the /daily redirect is permanent: false (next.config.ts:199) and both ExploreChipsBar / UnifiedMobileFeedNav now assert the restored "For you" chip.


What I verified

Dead references — zero hits. Swept the repo (excluding *.md, lockfile) for DailyHome, useDailyPage, DailySwitcher, DailyPageVariant, featureDailyPage, daily_page, DAILY_FEED_QUERY, dailyHeadlines/DAILY_HEADLINES_*, markDailySeen, DailyFeedback, DailyPostVotes, HeadlinesSettingsModal, useDailyFeed, Cover{Grid,Topics,Header,Closing}, optimisticMutations, RequestKey.DailyFeed, Origin.DailyPage, setDaily/setShowDaily, isDailyAsDefault, features/daily. Also ran a bare \bdaily\b sweep across shared/src, webapp, extension/src, storybook — every remaining hit is unrelated (daily-companion-app, QuestType.Daily, daily.dev URLs, funnel pricing, gameCenter.ts). packages/shared/src/features/daily/ and packages/webapp/pages/daily/ are gone with no orphan spec/story files, and no docs/AGENTS.md described the feature.

Transitive orphans — nothing became dead. The more interesting check than name-sweeping: symbols the deleted daily files imported, which a name-based grep won't flag if they lost their last consumer. Checked each plausible candidate — useScrambler, buildPersonalizedCategories, getAdFaviconImageLink, AdPixel/AdViewability, Pill, useAdQuery, viewabilityLogExtra, useUpdateQuery — all still have live consumers outside features/daily, so no newly-unreachable exports were left behind.

Imports/vars in edited files — checked every file where the diff removed the only consumer:

  • graphql/highlights.ts: Connection, ONE_MINUTE, MAJOR_HEADLINES_MAX_FIRST are all still used by the surviving headline queries; only Post / SHARED_POST_INFO_FRAGMENT became unused and both were dropped. ✅
  • sidebar/sections/MainSection.tsx: MagicIcon still used at line 73 (v2 "For You" icon), useConditionalFeature still needed for featureYearInReview — correct to keep both. ✅
  • feeds/ExploreChipsBar.tsx: isExtension and SharedFeedPage have no other use in the file; isCustomDefaultFeed and compact do. Correct set dropped. ✅
  • contexts/BootProvider.tsx: useState/useCallback still used elsewhere. ✅
  • extension/src/newtab/MainFeedPage.tsx: useCustomDefaultFeed still consumed at line 125. ✅
  • MainFeedLayout.tsx: correctly keeps its own onNavTabClick prop (used at line 682 for extension tab nav) — only the pass-through to ExploreChipsBar went away. ✅

Boot state teardowndaily removed from Boot, from the BootCacheData Pick, and from the filteredProps list in updateLocalBootData (BootProvider.tsx:88). Since filteredProps picks rather than omits, the stale daily key gets dropped from BOOT_LOCAL_KEY on the next boot write — no lingering per-user experiment state. The API still sends daily on /boot, which is harmless: the boot response isn't Zod-parsed, so an extra field can't throw. AuthContextProviderProps no longer picks daily/setDaily, and no <AuthContextProvider> call site (companion, storybook mocks, specs) passed them.

API surface / call sitesExploreChipsBar's only consumer is MainFeedLayout:351, so dropping the onNavTabClick prop breaks no caller. Memo dep arrays match their new bodies in all three touched components (MainFeedLayout:357, UnifiedMobileFeedNav:200-206isLoggedIn correctly retained since the label still branches on it, MainSection:200).

Nav/routingFeedNav shouldRenderNav / shouldRenderFeedChips no longer special-case /daily, correct now that the route is gone. Both MainFeedPages lost their daily-as-default branch cleanly (the webapp one also loses the pathname === '/daily' children passthrough, which existed solely for the deleted page). Un-gating "For you" restores the exact pre-experiment control list — the chip was only suppressed for users in the experiment, so control users are unaffected. /daily had no subpaths, so a single source: '/daily' redirect covers it, and Next preserves query strings by default.


Finding (non-blocking)

Test name doesn't match its assertionpackages/shared/src/components/feeds/ExploreChipsBar.spec.tsx:81

it('renders the For you category ahead of the given categories', () => {
  mockRouterPath('/');
  render(<ExploreChipsBar categories={createCategories()} />);
  expect(screen.getByRole('link', { name: 'For you' })).toHaveAttribute('aria-current', 'page');
});

The name promises ordering; the assertion only checks presence + active state. Ordering is precisely what this diff changed (showDailySwitcher ? categories : [forYouCategory, ...categories][forYouCategory, ...categories]), and nothing currently locks it in — a future refactor could append "For you" to the end and this test still passes. Asserting the rendered order (e.g. screen.getAllByRole('link').map(el => el.textContent) starts with ['For you', 'JavaScript', 'React'], allowing for the leading NewStripCta) would make the name true and pin the behavior. Alternatively just rename it to describe what it asserts.

Fix this →

Notes

Server-side leftoversdailyFeed, dailyHeadlines, markDailySeen and the boot daily field still exist on daily-api. Nothing here depends on them, but worth a follow-up ticket if not already tracked.


Verification I could not run

node_modules isn't installed in this environment and pnpm install isn't in my allowed tools, so I could not run pnpm --filter shared test, lint, or node ./scripts/typecheck-strict-changed.js. Everything above is static analysis. CI is the signal for the two touched specs plus pnpm --filter webapp test (per AGENTS.md, cross-package DOM assertions after shared-component changes).

Worth a manual pass on the preview: / logged-in (For you chip present, feed renders), /daily/, the mobile chips bar, and the sidebar (no "Daily" entry) — in both webapp and extension new tab, since the extension's MainFeedPage render tree changed shape.
· Branch: remove-daily-homepage

capJavert and others added 2 commits August 13, 2026 16:06
The test claimed the chip renders ahead of the given categories but only
asserted presence and active state, so appending it would still pass.
Assert the rendered order instead; verified it fails when the array is
flipped to [...categories, forYouCategory].

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@capJavert
capJavert merged commit 9c00769 into main Aug 13, 2026
12 checks passed
@capJavert
capJavert deleted the remove-daily-homepage branch August 13, 2026 14:32
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