feat: Reduce free plan feed limit from 20 to 10#8
Conversation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Review Summary by QodoReduce free plan feed limit to 10
WalkthroughsDescription• Reduce free plan feed limit from 20 to 10 • Update PRO_LIMITS constant in license service Diagramflowchart LR
A["PRO_LIMITS config"] -- "maxFeeds: 20 → 10" --> B["Updated free plan limit"]
File Changes1. src/services/licenseService.ts
|
Code Review by Qodo
1. Provider import bypasses cap
|
|
Caution Review failedThe pull request is closed. ℹ️ Recent review infoConfiguration used: defaults Review profile: CHILL Plan: Pro 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughA constant value in the license service was adjusted, reducing the maximum feeds limit for Pro users from 20 to 10. No function signatures, control flow, or other constants were modified. Changes
Estimated code review effort🎯 1 (Trivial) | ⏱️ ~3 minutes Poem
✨ Finishing Touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
|
||
| export const PRO_LIMITS = { | ||
| maxFeeds: 20, | ||
| maxFeeds: 10, |
There was a problem hiding this comment.
1. Provider import bypasses cap 🐞 Bug ✓ Correctness
External RSS provider import (Miniflux/FreshRSS/Feedbin/BazQux) adds feeds without any maxFeeds enforcement, so free users can exceed the new 10-feed limit via this path. This undermines the PR’s goal and creates inconsistent behavior versus AddFeed/OPML flows.
Agent Prompt
### Issue description
Free users can exceed the new 10-feed cap by importing subscriptions from an external RSS provider because that import path has no `maxFeeds` enforcement.
### Issue Context
Other flows (Add Feed modal + OPML import) enforce limits based on `PRO_LIMITS.maxFeeds`, but provider import does not. With the cap reduced to 10, this gap becomes more significant.
### Fix Focus Areas
- src/components/SettingsModal.tsx[305-320]
- src/services/providerSync.ts[89-145]
- src/services/licenseService.ts[5-8]
### Implementation notes
- Compute remaining slots for free users: `remaining = Math.max(0, PRO_LIMITS.maxFeeds - feedCount)`.
- Pass `remaining` into provider import (new optional argument), and in `ProviderSyncService.importFeeds` stop adding once `added === remaining`.
- If remote feeds exceed remaining capacity, show upgrade modal and/or a clear status message indicating partial import occurred.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
|
|
||
| export const PRO_LIMITS = { | ||
| maxFeeds: 20, | ||
| maxFeeds: 10, |
There was a problem hiding this comment.
2. Pro loading mis-gates users 🐞 Bug ⛯ Reliability
isPro defaults to false until an async init completes, but feed-limit gating ignores the loading state. With the limit now 10, more legitimate Pro users will have >10 feeds and can be incorrectly blocked/upsold during initial load.
Agent Prompt
### Issue description
Pro users can be temporarily treated as free because `isPro` initializes to `false` and only updates after async init, while gating checks ignore `loading`. With a 10-feed cap, this misclassification is more likely to block actions/show upgrade prompts.
### Issue Context
Multiple components gate on `!isPro` and `PRO_LIMITS.maxFeeds`, but none consider `loading`.
### Fix Focus Areas
- src/contexts/ProContext.tsx[68-106]
- src/components/SourcePanel.tsx[976-999]
- src/components/AddFeedModal.tsx[179-184]
- src/components/SettingsModal.tsx[379-383]
### Implementation notes
- Option A (best UX): initialize `isPro`/`licenseKey` from `readCache()` in the `useState` initializer to avoid the initial false render.
- Option B (safest enforcement): when `loading === true`, disable actions that would trigger gating (add feed, OPML import, provider import) and show a small “checking license…” message instead of upsell.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
Summary by CodeRabbit
Pro Plan Updates