Page MenuHomePhabricator

[L] For You Feed: Shared Card Chrome & Navigation
Open, HighPublic0 Estimated Story Points

Description

Background

The For You tab is one of two tabs in the Wikipedia mobile app's Explore Feed (alongside Community). It delivers a personalized, immersive full-screen reading experience. Every card in the feed shares a consistent chrome layer and navigation system that must be defined before individual modules are built.

Every For You card shares the same persistent chrome: Wikipedia logo (top left), Community tab access, language switcher dropdown (showing user-configured languages + link to language settings; changing language refreshes the module content in the selected language without leaving the module), and notification bell. The bottom navigation bar is always visible.

The feed is vertical: users scroll down (drag finger bottom-to-top) to advance through modules. Scrolling up (drag finger top-to-bottom) moves backward through the feed. Within each module, users swipe horizontally (left/right) to move between cards in that module's stack. Reaching the end of the feed and scrolling down returns users to the top of the stack.

User Story

As a Wikipedia reader, I want every card in the For You feed to have consistent navigation controls, so that I always know how to get to my notifications, switch languages, and move between the Community and For You tabs regardless of which module I'm on.

Requirements

Card layout

  • Each card in the For You feed is full-screen immersive, with only the bottom navigation bar persisting below card content.
  • The Wikipedia wordmark is displayed at the top left of every card.
  • A tab switcher (Community / For you) is accessible at the top of every card.
  • A language switcher dropdown is accessible at the top of every card. It lists all languages the user has configured. Selecting a language refreshes the feed to that language. A 'Manage languages' option at the bottom of the dropdown navigates to the language settings screen.
  • Profile is still accessible at the top of every card. It shows a badge when unread notifications are present
  • Tabs are still accessible at the top
  • Each card has a three-dot more menu. Tapping it presents 4 options: Save/Remove from Saved, Share, Hide this card, Hide module, Customize interests.
    • Save/Remove from Saved: Saves article to reading list
    • Share: Opens share dialog
    • Hide module: turns off the entire module in Explore Feed settings (For recommendations, this turns off all "Based on your interest" recommendations, not just the single topic)
    • Hide this card: removes this articles suggestion from their screen. System remembers hidden state locally on device and does not show article again within "For you"
    • Customize Interests: Leads to settings for "For you" modules (built on separate task). updated July 24: Lead directly into interests selection screen in Settings
  • There are 3 variants of card format
    • For all article variants, display
      • Reason label ('Because of your interest: [Interest]')
      • Article title
      • Card position indicator
      • Three-dot more menu
    • For the First and fourth article in stack: Variant 1: Balanced
      • Full image in background
      • Short text (first paragraph) excerpt from the article.
    • Second article in stack: Variant 2: Image-focused
      • Full image in background
      • Article description (omit if no article description exists)
    • Third article in stack: Variant 3: Text-focused
      • No image
      • Text extract
    • Fourth article in stack: Variant 1: Balanced
    • In any scenario, if no image is available, a background color is shown instead. Design of card is slightly modified (Figma)
  • Tapping a card navigates the user to the full article.

Behavior

  • Vertical swipe (bottom-to-top) advances to the next module. Vertical swipe (top-to-bottom) goes back to the previous module.
  • Horizontal swipe (right-to-left) advances to the next card within a module. Horizontal swipe (left-to-right) returns to the previous card within a module.
  • When users reach the end of the feed, scrolling should stop
  • Automatically refresh the feed automatically every calendar day (early in the local day for the user). After the daily refresh, do not automatically refresh the feed unless the user chooses to.
  • Allow users to pull down to manually refresh
    • On refresh, check for updates to the user's history and interests (i.e. if they have cleared their history, or removed one item from history, that history should not be used to calculate the feed after refresh)
  • If a user navigates to a different tab of the app and then back to home, remember their place in the feed.
  • If the feed cannot load due to the user not being connected to the internet, give a clear error state.

Cross-module checks:

  • Duplicate articles should not show up in the same carousel in the same module on the same Day (i.e. Continue reading & Saved articles)
  • Duplicate articles should not show up in different modules on the same day (i.e. Because you read & Because of your interest:)
  • Articles hidden using "Hide this card" should remain hidden on the feed indefinitely
Module order
  • Based on your Interests [3 interests]
  • Because You Read (Based on your reading history)
  • Continue Reading
  • Places of Interest [Phase 2]
  • Discover [Phase 2]
  • Random [Phase 2]
  • Games Teaser [Phase 2]
  • Based on your interests [remaining interests]

Design

Figma file →

Variant 1: balanced →
Variant 2: Image-focused →
Variant 3: Text-focused AND when no image is available →

Error state if no internet

Note: The UI chrome stays persistent while content cards animate in and out on swipe. This minimizes context switching and keeps users oriented within the app. Example of interaction here (please do not consider styling, the Figma file is the source of truth for that). For accurate visualization, enable responsive mode in browser DevTools - https://tlessa.github.io/explore-feed/for-you/index.html

Design: Guidance on iPad layout

Android tasks for reference

https://phabricator.wikimedia.org/T419626
https://phabricator.wikimedia.org/T427571
https://phabricator.wikimedia.org/T423957

Toni Handoff Notes

Based on progress at PR https://github.com/wikimedia/wikipedia-ios/pull/5995

Things remaining todo:

  • Fix design so it is full screen
  • Tab switcher should be redone to match design
  • Language switcher design should be fixed to match design
  • Card designs should be updated to match design (layout + fonts, position of the more button, etc)
  • Ensure design looks good on all iPhone sizes, rotation, dynamic type, themes, iPad.

Each card has a three-dot more menu. Tapping it presents 4 options: Save/Remove from Saved, Share, Hide this card, Hide module, Customize interests.

We need save / unsave and share functionality. Three-dot more menu Hide options + Customize Interests are done.

There are 3 variants of card format:

Right now there is only a single design. We need to add variant designs.

Tapping a card navigates the user to the full article.

Need to add this navigation.

Automatically refresh the feed automatically every calendar day (early in the local day for the user). After the daily refresh, do not automatically refresh the feed unless the user chooses to.

We should test this. It should work when an app is launched from termination, but we may need to check and try to fetch the data again (fetchCommunity & fetchForYou) upon foreground. I suspect if a user backgrounds on one day, and foregrounds on the next day, will still see the previous day's data.

Q: Should we have BackgroundTasks run a the main fetchCommunity / fetchForYou to hydrate the cache?

Duplicate articles should not show up in the same carousel in the same module on the same Day (i.e. Continue reading & Saved articles)

This still needs to be done.

Duplicate articles should not show up in different modules on the same day (i.e. Because you read & Because of your interest:)

This still needs to be done.

Articles hidden using "Hide this card" should remain hidden on the feed indefinitely

Note I matched Android here, which is item-bound by 100 items. We should double-check that this is okay.

Event Timeline

There are a very large number of changes, so older changes are hidden. Show Older Changes
Mazevedo renamed this task from For You Feed: Shared Card Chrome & Navigation to [L] For You Feed: Shared Card Chrome & Navigation.Jul 1 2026, 2:28 PM
Mazevedo subscribed.

@HNordeenWMF this one should be picked up before any other "for you" task

It's up to ya'll on which approach you think would make more sense.

HNordeenWMF raised the priority of this task from Low to Medium.Jul 1 2026, 3:02 PM
HNordeenWMF moved this task from Backlog to P2 (Needs refinement) on the App Experience board.
HNordeenWMF raised the priority of this task from Medium to High.Jul 13 2026, 7:19 PM

@SChekfa-WMF could you add a figma respresentation of what the "For you" feed should look like if it's unable to load due to lack of internet (this can be reused for other error states).

HNordeenWMF removed a project: Design.
HNordeenWMF updated the task description. (Show Details)
HNordeenWMF added a subscriber: SChekfa-WMF.
Mazevedo set the point value for this task to 5.Jul 15 2026, 2:19 PM

@GOlson-WMF a few things I saw while testing

  1. Ideally we preference articles with images for the first cards in each module, or preference articles with images for use in Variants 1 and 2. Is that in place already for iOS? Let me know if it makes most sense to implement here, or when we do something similar for the interest selections tilesT433107: [User story] Filter article cards shown in interest selection < That task has advice from Dmitry on it
  2. The overflow menu > Customize interests > should go right to the "What are you interested in?" screen

@GOlson-WMF there are also 2 3-dot menus

Note from demo: We're seeing a flicker in carousel - after swiping, shows different card before flashing to correct one with image. Seems like the image is loading after we have decided what format to use. Need to frontload the images before we get to them

Note from demo: We're seeing a flicker in carousel - after swiping, shows different card before flashing to correct one with image. Seems like the image is loading after we have decided what format to use. Need to frontload the images before we get to them

Another item from demo:
get the normalized title for the interest at the bottom on each card, no underscores

Seddon changed the point value for this task from 5 to 2.

@GOlson-WMF just restating this one so it doesn't get lost!

There are currently 2 overflow menus in 370 for the non-image variant (variant 3), but there should only be 1. https://www.figma.com/design/z1skQr04i9TPtINRlhWcBH/iOS--Explore-Feed-Refresh?node-id=378-26870&t=zIeDoHTaVmM37nbv-4. The overflow in the article card has the module-level options: Share, save, hide this card, hide module, customize interests.

Mazevedo changed the point value for this task from 2 to 0.Tue, Aug 11, 4:23 PM

Available in: TestFlight Wikipedia 2026.08.12 (6145)

@SChekfa-WMF
Can be reviewed in Wikipedia 2026.08.12 (6145) and any newer build.

Toni noted 2 edge cases in code review that weren't covered in specs, let me know what you'd like to do with these https://github.com/wikimedia/wikipedia-ios/pull/6029#issuecomment-5273226946

@Mazevedo i couldn't get the error state for no internet to show, do you have a screenshot of that?

punchlist: https://docs.google.com/spreadsheets/d/1NCakm_9yjDqQ-WndfzKe2vXMw9Bxakx2ORLjUsEk-3k/edit?usp=sharing

also, we should fix the dynamic text issue that Toni noted for sure -- can we include that as well? it's a P0 since it impacts accessibility.

re #2, not sure how to handle this @HNordeenWMF since it's the older system -- are we actively maintaining that?

also noting this fix that needs to be implemented, per our conversation on Slack https://wikimedia.slack.com/archives/C0BB50D9TGD/p1786738287412729?thread_ts=1786735268.679119&cid=C0BB50D9TGD (this addresses note 1 in the punchlist) @Mazevedo

I added Toni's items to the punchlist. iOS 17/18 issue is a P0, since 11% of the users on the latest app version are iOS 17/18 and it looks broken (I finally found where to see that in App store connect, yay!). Hopefully it's easy to treat the W, Tabs, and Profile similarly to language picker & segmented control.

Just reviewed the punchlist & I agree with prioritizations. P0 items must be addressed, then this ticket can go to QA. @Mazevedo please leave commentsin punchlist and tag me if any items add significant scope to fix.

@SChekfa-WMF you can create follow-up tickets for P1/P2 items.