Add pull-to-refresh to the article list
Nobody has claimed this yet.
Assessment
- Difficulty
- 1/5
- Estimated time
- Under an hour
- Newbie friendliness
- 88/100
Research direction
Start with Today/Views/TodayView.swift and compare the existing sync-button pattern in Today/Views/FeedListView.swift. Use Today/Services/FeedManager.swift to confirm the sync entry point, then verify the iOS refresh gesture, loading indicator, list updates, macOS build, and existing filtering, search, and category behavior.
Written by the indexing model from the issue text.
Description
Summary
Add pull-to-refresh gesture to the article list in TodayView so users can manually trigger a feed sync without navigating to the Feeds tab.
Context
Currently, users who want to sync their feeds must go to the Feeds tab and tap the sync button. The article list in TodayView has no way to trigger a refresh. Pull-to-refresh is a standard iOS pattern that users expect in any scrollable content list, and the sync infrastructure already exists — it just needs to be wired up.
Acceptance Criteria
- Pulling down on the article list in TodayView triggers a feed sync
- A loading indicator is visible while the sync is in progress
- The list updates automatically when new articles arrive (already handled by
@Query) - Works on iOS and does not break macOS layout
- No regressions to existing filtering, search, or category selection
Scope
In scope:
- Add
.refreshablemodifier to the List in TodayView - Call
FeedManager.syncAllFeeds()from the refresh action
Out of scope:
- Changes to sync frequency or background fetch logic
- Adding pull-to-refresh to any other view
- Changing the sync behavior itself
Technical Notes
Key files:
Today/Views/TodayView.swift— main article list, add.refreshablehereToday/Services/FeedManager.swift—syncAllFeeds()is the method to callToday/Views/FeedListView.swift— reference for how sync is currently triggered via button
Patterns to follow:
FeedListView.swiftcallsfeedManager.syncAllFeeds()for the sync button — use the same call- SwiftUI
.refreshable { await ... }modifier works onList .refreshableis iOS-only — wrap in#if os(iOS)to avoid macOS build errors
Complexity
-
complexity:low— Single file, obvious pattern, quick fix -
complexity:medium— Multiple files, follows established patterns -
complexity:high— Architectural decisions, new patterns, needs planning phase
Agent Readiness
- Scope is bounded (can be done in one PR)
- Success criteria are measurable
- Context explains the "why"
- Patterns are linked, not assumed
- No external blockers (APIs available, dependencies installed)
- Complexity is appropriate for agent execution
- Dominant language
- Swift
- Stars
- 21
- Forks
- 2
- PR merge metrics
- No merged PRs in 30d
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from whyisjake/today
-
agent-ready
Difficulty 3/5 1-2 days Newbie friendliness 74/100
-
agent-ready
-
whyisjake/today#89 · 2 comments · 1 reaction · 2 assignees ·
-
Difficulty 4/5 3-5 days Newbie friendliness 45/100
Similar issues
-
type: docs
Difficulty 1/5 Under an hour Newbie friendliness 95/100
googleapis/google-cloud-swift#971 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
bitcoindevkit/bdk-ffi#1125 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
mozilla-mobile/firefox-ios#35743 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
manaflow-ai/cmux#13417 ·
-
triage
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
ionic-team/capacitor#8616 ·