Skip to content

docs(share): review the Share my feed placements on the app - #6579

Draft
tomeredlich wants to merge 3 commits into
mainfrom
claude/share-my-feed-surface
Draft

docs(share): review the Share my feed placements on the app#6579
tomeredlich wants to merge 3 commits into
mainfrom
claude/share-my-feed-surface

Conversation

@tomeredlich

@tomeredlich tomeredlich commented Sep 2, 2026

Copy link
Copy Markdown
Contributor

Puts the Share my feed placement into the real feed settings modal, behind a flag, and keeps the placement review that argues for it as a dev page.

What ships

The real surfaceFeedSettingsGeneralSection.tsx

Custom feeds get a Share this feed block between the default-feed toggle and the Happening Now placement. That tab already gates feed name, the emoji picker, the default-feed toggle and delete behind isCustomFeed; sharing is the same kind of thing — a property of a feed you built — so it goes in that set rather than into a share menu.

The description carries the part the link cannot say for itself: "anyone who opens your link gets this feed added to their own, tags and sources included." Without that sentence a feed link reads as a link to your private feed, which is the one thing it cannot be.

Flaggingshare_my_feed, default false

Merging changes nothing on app.daily.dev; the rollout stays a GrowthBook decision. Branch previews force it on through the new isPreviewHost() helper, because a preview runs NODE_ENV=production against the production API and has no dev mode or GrowthBook tooling to open a flag from the browser. Evaluated via useConditionalFeature with shouldEvaluate: isCustomFeed, so the flag is only read where the block could render.

The placement review/dev/share-my-feed

The full argument, drawn at desktop/tablet/mobile: the sharer's three states, the recipient's four, and the four decisions. Host-gated (localhost + *.preview.app.daily.dev, blocked on app.daily.dev/www.daily.dev) and noindex/nofollow.

What is deliberately not real yet

  • The link does not resolve. Feeds are user-scoped, so feeds/shared/<id> has nothing behind it for a non-owner. The shareable token — read-only, revocable, not leaking the owner's other feeds — is backend work, and it is the whole reason the flag stays off. The button copies the shape the feature needs so the placement and copy can be judged now.
  • The recipient's landing is not built — preview, added, no-session and feed-limit states live on the dev page only, since they cannot be wired without the above.
  • The top-20 text list (the original feat(share): copy-my-feed digest button in the feed nav #6362 idea) is on the dev page as the Also variant, not in the modal. The link is the offer; the list is the fallback for where a link will not do.

Decisions on the record

Feed sharing is not a snapshot — a custom feed is a name, an icon and a tag set, so the thing worth sending is the feed itself, not a picture of its posts. This revises the sharing map (#6362), which had it down as snapshot-only on the assumption there was nothing to link to. The recipient gets a copy taken at add time, not a live subscription; sign-in is required with no logged-out preview; and an added feed uses a feed slot, with the cap surfacing as an error toast rather than a disabled button.

Events

None.

Experiment

share_my_feed, default off.

Testing

  • New FeedSettingsGeneralSection.spec.tsx: no share block while the flag is off, block plus a Copy link button on a custom feed when it is on, and nothing on the main feed.
  • pnpm --filter shared test src/components/feeds — 7 suites / 21 tests pass.
  • pnpm --filter webapp test — 81 suites / 648 tests pass (shared component touched).
  • eslint clean on every touched file; node ./scripts/typecheck-strict-changed.js clean.
  • /dev/share-my-feed verified on the preview's production build: all seven states, no Tailwind purge, hydration and theme toggle working, clean console.

🤖 Generated with Claude Code

Preview domain

https://claude-share-my-feed-surface.preview.app.daily.dev

@vercel

vercel Bot commented Sep 2, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated
daily-webapp Ready Ready Preview Sep 2, 2026 9:36am UTC
1 Skipped Deployment
Project Deployment Actions Updated
storybook Ignored Ignored Sep 2, 2026 9:36am UTC

Request Review

tomeredlich and others added 2 commits September 2, 2026 12:21
Ports the Share my feed placement review out of Storybook and onto
/dev/share-my-feed, so the surfaces are read against real app CSS and the
app's own theme switch rather than Storybook's.

Covers the sharer (a share link in the feed settings General tab, where
every other custom-feed-only block already lives, plus the top-20 text
list as the fallback), the recipient's landing (preview, added, no
session, feed limit), and the four decisions behind them.

Controls are inert: this compares placement and copy, not behaviour. No
production surface changes, and the page is gated to development with
noindex/nofollow.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The page was gated to `isDevelopment`, which makes it unreachable on the
branch preview deployment — the surface reviewers actually open. Swaps
that for the host gate /dev/snapshot uses: block the canonical
production hosts only, and allow localhost plus
*.preview.app.daily.dev.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Puts the reviewed placement into the real modal instead of only in the
mock: custom feeds get a "Share this feed" block between the default-feed
toggle and the Happening Now placement, with the description carrying the
part the link cannot say for itself — that opening it adds the feed to
the recipient's own account.

The `share_my_feed` flag defaults to false, so merging changes nothing on
app.daily.dev. Branch previews force it on via `isPreviewHost`, since a
preview runs as production and has no GrowthBook tooling to open a flag
from the browser.

The link is the shape the feature needs, not a working one: feeds are
user-scoped, so resolving it for a non-owner is the backend work this is
still waiting on.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@tomeredlich
tomeredlich force-pushed the claude/share-my-feed-surface branch from ab9f3cf to 56c8afb Compare September 2, 2026 09:32
tomeredlich added a commit that referenced this pull request Sep 3, 2026
…o choose from

The Snapshot button becomes a Share button: the icon and label are the ones
people already recognise, and pressing it opens a menu that previews the
designed 1080² card before offering it.

The menu opens immediately with a skeleton rather than waiting on the render.
Rasterizing takes a second or two, and a control that does nothing visible for
that long reads as broken — so the capture is deferred a tick, letting the menu
paint first, and Copy link stays usable while the card is still rendering.

Seven layouts are up for review in Features/Snapshot/Menu styles, all live
against the same card: rows, rows-centred, an overlay pill on the card, a
compact no-preview variant, Tsahi's split button from #6369, and the two ways
the image can sit in the share modal — its own section or a single tile. The
`menuVariant` prop exists to serve that page and comes out with the losers.

The image is one action, not a mode over the sheet's other targets. A link needs
a destination, which is why there are twenty of them; an image does not, because
the OS share sheet and the clipboard are the destinations, and no web share
intent takes an image anyway. So the image owns its own action and the squads
and external tiles keep sharing the link — which is what keeps this on one
screen instead of two.

Pressing it hands the PNG to the native sheet where the platform takes files,
copies it to the clipboard otherwise (with a toast, since the clipboard has no
UI of its own), and downloads it only as a last resort.

Capture moves into `useSnapshotCapture` so the dropdown and the modal section
render from one implementation. Its `isActive` gate matters twice: a feed never
carries a 1080px card per item until someone asks to share, and because the
modal pre-renders on open, the click handler reaches `clipboard.write` with no
await in front of it — still inside the user gesture the clipboard requires.

Two surfaces had no card at all, from the #6579 and #6581 reviews:

- `FeedSnapshotCard` carries a shared feed's recipe — tags and source count —
  rather than its posts, which are a standing filter and would go stale.
- `AwardSnapshotCard` names the sender. It is the only status moment that comes
  from someone else, and a gift with no giver reads as self-congratulation.

Tsahi's `SplitShareButton` and `CopyStateIcon` come across from #6369 unchanged
apart from four additive props — `onOpenChange`, `header`, `menuLayout` and a
width override — so his grid is untouched when nobody passes them.

`SocialShareList`, `SocialShareButton` and `SocialShareContainer` gain optional
size and compact props, defaulting to today's values, so the dropdown can
tighten without moving anything else in the app.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
tomeredlich added a commit that referenced this pull request Sep 3, 2026
Two corrections after catching up with the branch.

FeedSnapshotCard goes: ac9dacd already settled that a custom feed is
shared as the feed itself, not a picture of its posts, and took snapshot
off that surface entirely. The card was written from the #6579 review
page without checking that decision first.

The clipboard write now goes through copyShareImage instead of calling
`clipboard.write` inline. The util hands ClipboardItem a promise rather
than a resolved blob, which is what keeps Safari from dropping the write
for losing the gesture — and there is no reason for two of these.

The toast moves to ToastType.Success rather than a ✅ in the string.

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