Skip to content

feat: Reduce free plan feed limit from 20 to 10#8

Merged
devohmycode merged 1 commit intomasterfrom
0.6.1
Feb 27, 2026
Merged

feat: Reduce free plan feed limit from 20 to 10#8
devohmycode merged 1 commit intomasterfrom
0.6.1

Conversation

@devohmycode
Copy link
Owner

@devohmycode devohmycode commented Feb 27, 2026

Summary by CodeRabbit

Pro Plan Updates

  • Maximum feed limit for Pro tier adjusted to 10

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@devohmycode devohmycode merged commit aaa0ec4 into master Feb 27, 2026
1 check was pending
@qodo-code-review
Copy link

Review Summary by Qodo

Reduce free plan feed limit to 10

✨ Enhancement

Grey Divider

Walkthroughs

Description
• Reduce free plan feed limit from 20 to 10
• Update PRO_LIMITS constant in license service
Diagram
flowchart LR
  A["PRO_LIMITS config"] -- "maxFeeds: 20 → 10" --> B["Updated free plan limit"]
Loading

Grey Divider

File Changes

1. src/services/licenseService.ts ⚙️ Configuration changes +1/-1

Reduce free plan feed limit constant

• Reduced maxFeeds limit from 20 to 10 in PRO_LIMITS constant
• Affects free plan feed subscription restrictions

src/services/licenseService.ts


Grey Divider

Qodo Logo

@qodo-code-review
Copy link

qodo-code-review bot commented Feb 27, 2026

Code Review by Qodo

🐞 Bugs (4) 📘 Rule violations (0) 📎 Requirement gaps (0)

Grey Divider


Action required

1. Provider import bypasses cap 🐞 Bug ✓ Correctness
Description
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.
Code

src/services/licenseService.ts[6]

+  maxFeeds: 10,
Evidence
PRO_LIMITS.maxFeeds was lowered to 10 and is used to gate feed creation/import in some UI flows,
but the provider import flow calls ProviderSyncService.importFeeds() without checking
isPro/limits, and the service itself loops through all remote feeds and pushes them to storage
without any cap logic.

src/services/licenseService.ts[5-8]
src/components/SettingsModal.tsx[305-320]
src/services/providerSync.ts[89-145]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


2. Pro loading mis-gates users 🐞 Bug ⛯ Reliability
Description
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.
Code

src/services/licenseService.ts[6]

+  maxFeeds: 10,
Evidence
Pro status starts as false and is updated asynchronously; components gate on !isPro without
considering loading. Lowering maxFeeds to 10 increases the chance that a Pro user’s existing
feed count exceeds the free cap during that initial window, triggering upgrade prompts or blocking
add/import actions.

src/contexts/ProContext.tsx[68-73]
src/contexts/ProContext.tsx[75-106]
src/components/SourcePanel.tsx[976-983]
src/services/licenseService.ts[5-8]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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



Remediation recommended

3. OPML import over-blocks 🐞 Bug ✓ Correctness
Description
OPML import checks feedCount + feedsToImport.length against the cap before accounting for
duplicates/already-subscribed feeds. With a smaller cap (10), this will more often block imports
that would not actually exceed the limit once deduped.
Code

src/services/licenseService.ts[6]

+  maxFeeds: 10,
Evidence
SettingsModal gates using the raw OPML feed count, but the underlying import implementation skips
URLs that already exist. Therefore the pre-check can overestimate net-new feeds and incorrectly
force an upgrade modal.

src/components/SettingsModal.tsx[373-383]
src/hooks/useFeedStore.ts[425-445]
src/services/licenseService.ts[5-8]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The OPML import limit check counts all feeds in the file, even though the actual import skips existing URLs; this can incorrectly block imports.

### Issue Context
The cap is now 10, increasing the likelihood that `feedCount + feedsToImport.length` crosses the threshold even when the true net-new count would not.

### Fix Focus Areas
- src/components/SettingsModal.tsx[373-386]
- src/hooks/useFeedStore.ts[425-445]

### Implementation notes
- Build `feedsToImportUniqueNew` by filtering:
 - duplicates within the OPML list
 - feeds already present (can be derived from current store state or from `localStorage` key `superflux_feeds`)
- Compare `feedCount + feedsToImportUniqueNew.length` to `PRO_LIMITS.maxFeeds`.
- Optionally import only the first `remainingSlots` feeds and show upgrade modal if some were left out.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Advisory comments

4. Misleading limit constant name 🐞 Bug ✓ Correctness
Description
PRO_LIMITS is only applied when !isPro, so it effectively represents free-tier limits; lowering
it to 10 makes the naming even more confusing. This increases the chance of future mistakes when
adding real Pro-tier limits or updating pricing copy.
Code

src/services/licenseService.ts[6]

+  maxFeeds: 10,
Evidence
All usages of PRO_LIMITS.maxFeeds are guarded by !isPro, demonstrating it is being used as a
free-tier cap despite the name PRO_LIMITS. With the constant now set to 10, it reads as if Pro
users are limited to 10 feeds (even though they bypass the check).

src/services/licenseService.ts[5-8]
src/components/AddFeedModal.tsx[179-184]
src/components/SourcePanel.tsx[978-981]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The constant name `PRO_LIMITS` is misleading because it is used to enforce limits only when `!isPro`.

### Issue Context
With `maxFeeds` now set to 10, the name strongly suggests Pro is limited to 10 feeds even though Pro bypasses the check.

### Fix Focus Areas
- src/services/licenseService.ts[5-8]
- src/components/AddFeedModal.tsx[179-184]
- src/components/SourcePanel.tsx[978-999]
- src/components/SettingsModal.tsx[379-383]

### Implementation notes
- Rename constant and update all imports.
- Consider grouping limits by tier to prevent future confusion (e.g., `{ free: {...}, pro: {...} }`).

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

ⓘ The new review experience is currently in Beta. Learn more

Grey Divider

Qodo Logo

@coderabbitai
Copy link

coderabbitai bot commented Feb 27, 2026

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7ab6085 and 7f9eef3.

📒 Files selected for processing (1)
  • src/services/licenseService.ts

📝 Walkthrough

Walkthrough

A 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

Cohort / File(s) Summary
License Configuration
src/services/licenseService.ts
Updated PRO_LIMITS.maxFeeds constant value from 20 to 10

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~3 minutes

Poem

🐰 Ten feeds now fit in a Pro user's den,
Down from the twenty we had before, my friend!
A simple tweak, a number so small,
Yet limiting feeds for the Pro tier's call! 🥕

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch 0.6.1

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.


export const PRO_LIMITS = {
maxFeeds: 20,
maxFeeds: 10,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

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,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

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

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