docs(share): review the Share my feed placements on the app - #6579
Draft
tomeredlich wants to merge 3 commits into
Draft
docs(share): review the Share my feed placements on the app#6579tomeredlich wants to merge 3 commits into
tomeredlich wants to merge 3 commits into
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
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>
tomeredlich
force-pushed
the
claude/share-my-feed-surface
branch
from
September 2, 2026 09:25
fb4476a to
ab9f3cf
Compare
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
force-pushed
the
claude/share-my-feed-surface
branch
from
September 2, 2026 09:32
ab9f3cf to
56c8afb
Compare
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 surface —
FeedSettingsGeneralSection.tsxCustom 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.
Flagging —
share_my_feed, defaultfalseMerging changes nothing on
app.daily.dev; the rollout stays a GrowthBook decision. Branch previews force it on through the newisPreviewHost()helper, because a preview runsNODE_ENV=productionagainst the production API and has no dev mode or GrowthBook tooling to open a flag from the browser. Evaluated viauseConditionalFeaturewithshouldEvaluate: isCustomFeed, so the flag is only read where the block could render.The placement review —
/dev/share-my-feedThe 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 onapp.daily.dev/www.daily.dev) andnoindex/nofollow.What is deliberately not real yet
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.Alsovariant, 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
FeedSettingsGeneralSection.spec.tsx: no share block while the flag is off, block plus aCopy linkbutton 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).node ./scripts/typecheck-strict-changed.jsclean./dev/share-my-feedverified 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