๐ง Feed Intelligence & Hygiene
FeedReader's feed intelligence layer goes beyond basic RSS reading โ it continuously audits your subscriptions for diversity, detects anomalous feed behavior, models your memory retention, coaches your reading habits, scores source credibility, and recommends smart unsubscriptions. All analysis runs on-device with zero external API calls.
On This Page
๐ Source Diversity Auditor
FeedSourceDiversityAuditor detects echo chambers in your reading diet. It analyzes
your feed subscriptions and reading patterns across four dimensions to quantify how diverse
your information sources really are.
Analysis Dimensions
| Dimension | Method | What It Detects |
|---|---|---|
| Source Concentration | Herfindahl-Hirschman Index (HHI) | Over-reliance on a few sources โ e.g., 80% of articles from one feed |
| Topic Monoculture | Cluster analysis | Narrow topic coverage โ all feeds covering the same subjects |
| Viewpoint Clustering | Jaccard similarity | Sources with high content overlap, reducing perspective breadth |
| Reading Bias | Gini coefficient | Disproportionate attention to a subset of subscriptions |
Echo Chamber Risk Levels
- ๐ข Minimal โ Diverse, well-balanced reading
- ๐ต Low โ Mostly diverse, minor gaps
- ๐ก Moderate โ Some concentration detected
- ๐ High โ Significant echo chamber indicators
- ๐ด Critical โ Severe echo chamber โ urgent diversification needed
API
let auditor = FeedSourceDiversityAuditor.shared
// Configure thresholds
auditor.config.evaluationWindowDays = 30
auditor.config.sourceConcentrationThreshold = 0.25
auditor.config.viewpointClusterThreshold = 0.5
// Run a full audit
let report = auditor.audit(
feeds: myFeeds,
readHistory: readingHistory
)
print("Diversity Index: \(report.overallDiversityIndex)")
print("Echo Chamber Risk: \(report.echoChamberRisk)")
for rec in report.recommendations {
print("โ \(rec)")
}
// Enable auto-monitoring (checks every 7 days)
auditor.config.autoMonitorEnabled = true
auditor.config.autoMonitorIntervalDays = 7
The auditor produces a DiversityReport with per-dimension scores, an overall diversity
index, echo chamber risk level, and proactive balancing recommendations. Reports persist as JSON
in the Documents directory for trend tracking.
๐ Feed Anomaly Detector
FeedAnomalyDetector monitors feed behavior over time and detects unusual patterns
that may indicate feed issues, content hijacking, or significant editorial changes.
Detection Channels
- Posting Frequency โ Sudden bursts (possible spam) or droughts (feed may be dead)
- Content Length โ Articles significantly shorter or longer than the feed's baseline
- Topic Drift โ Feed suddenly covers different subjects than its established pattern
- Author Patterns โ New or missing authors that break the expected contributor profile
- Link Domains โ Articles linking to unusual or suspicious domains
- Title Patterns โ Style or format changes in article titles
How It Works
The detector builds a statistical baseline from historical feed data, then uses Z-score analysis to flag deviations. Each anomaly is classified by severity:
- Info โ Notable but not concerning
- Warning โ Unusual pattern worth investigating
- Critical โ Strong indicator of feed compromise or failure
Feed Trust Scoring
Each feed receives a dynamic trust score (0โ100) that adjusts based on anomaly history. Feeds with frequent critical anomalies see their trust score decay over time, providing a long-term reliability signal.
API
let detector = FeedAnomalyDetector.shared
// Analyze a feed against its baseline
let anomalies = detector.analyze(feed: myFeed)
for anomaly in anomalies {
print("[\(anomaly.severity)] \(anomaly.channel): \(anomaly.description)")
}
// Check trust score
let trust = detector.trustScore(for: myFeed.id)
print("Trust: \(trust)/100")
// Enable continuous monitoring
detector.startAutoMonitor()
// Listen for anomalies
NotificationCenter.default.addObserver(
forName: .feedAnomaliesDetected, ...
)
๐ง Forgetting Curve Memory
FeedForgettingCurve models each read article as a memory trace that decays over time
using the Ebbinghaus forgetting curve formula: R = eโt/S. When retention drops
below a threshold, the system suggests timely refreshers so you retain key knowledge.
How Memory Decay Works
Every article you read creates a memory trace with a computed initial strength S
(based on reading time, completion, and engagement). Retention R decays exponentially
over time t. Each time you review the article, the strength increases โ exactly like
spaced repetition systems such as Anki.
Refresher Urgency Levels
| Level | Retention | Action |
|---|---|---|
| ๐ข Stable | > 60% | No action needed |
| ๐ก Weakening | 40โ60% | Consider reviewing soon |
| ๐ Fading | 20โ40% | Review recommended |
| ๐ด Critical | < 20% | Urgent โ review now or lose it |
API
let curve = FeedForgettingCurve.shared
// Record reading an article
curve.recordReading(articleId: "abc", strength: 0.8)
// Get current retention for an article
let retention = curve.retention(for: "abc")
// Get all articles needing refreshers
let refreshers = curve.articlesNeedingRefresh()
for item in refreshers {
print("\(item.articleId): \(item.urgency) โ \(Int(item.retention * 100))% retained")
}
// Record a review (boosts memory strength)
curve.recordReview(articleId: "abc")
// Listen for refresh notifications
NotificationCenter.default.addObserver(
forName: .memoryRefresherNeeded, ...
)
๐๏ธ Personal Reading Coach
FeedReadingCoach is an autonomous personal reading coach that analyzes your reading
behavior and provides personalized insights, goals, and coaching recommendations.
What It Tracks
- Session patterns โ When you read, for how long, and your completion rates
- Peak hours โ Identifies your most productive reading times
- Speed trends โ Tracks reading speed (WPM) over time
- Topic preferences โ Maps your interest profile from actual reading behavior
- Focus scores โ Per-session focus quality based on duration and completion
- Streak tracking โ Consecutive-day reading habit building
Coaching Insights
The coach generates actionable insights based on detected patterns:
- ๐ "You read most effectively between 9โ11 AM. Try scheduling important articles then."
- โก "Your reading speed increased 15% this week โ your comprehension practice is paying off."
- ๐ฏ "You've been reading only tech articles. Consider diversifying with science or culture."
- ๐ "Completion rates dropped this week. Try shorter articles to rebuild momentum."
Goal System
Set reading goals and track progress:
- Articles per day/week
- Minutes per day
- Words per day
- Topic diversity targets
API
let coach = FeedReadingCoach.shared
// Record a reading session
let session = ReadingSession(
articleId: "abc", feedTitle: "TechCrunch", topic: "tech",
startTime: Date(), durationSeconds: 240,
wordCount: 800, completionPercent: 0.95
)
coach.recordSession(session)
// Get coaching insights
let insights = coach.generateInsights()
for insight in insights {
print("[\(insight.category)] \(insight.message)")
}
// Set a goal
coach.setGoal(ReadingGoal(type: .articlesPerDay, target: 5))
// Weekly coaching report
let report = coach.weeklyReport()
print(report.summary)
๐ก๏ธ Source Credibility Scorer
SourceCredibilityScorer evaluates article sources by analyzing domain reputation
signals, content quality indicators, and transparency patterns. It produces a composite
credibility score (0โ100) โ all with pure, stateless, on-device heuristics. No external API calls.
Scoring Dimensions
| Dimension | Weight | What It Evaluates |
|---|---|---|
| Domain Reputation | 30% | Curated allowlists/blocklists, TLD quality, domain age heuristics |
| Content Quality | 25% | Article length, readability grade, citation presence, quote attribution |
| Transparency | 20% | Author attribution, about page, contact info, correction policy |
| Editorial Standards | 15% | Headline quality (clickbait detection), fact-opinion separation |
| Technical Trust | 10% | HTTPS enforcement, ad density heuristics, redirect chains |
Credibility Tiers
- ๐ข High Credibility โ Established, transparent, well-sourced
- ๐ต Moderate Credibility โ Generally reliable with minor gaps
- ๐ก Mixed Credibility โ Some concerns; verify important claims
- ๐ด Low Credibility โ Significant trust issues; treat with caution
- โช Unknown โ Insufficient data to evaluate
API
let scorer = SourceCredibilityScorer()
let report = scorer.evaluate(
domain: "arstechnica.com",
articleText: articleBody,
articleTitle: "New CPU Architecture..."
)
print("Score: \(report.overallScore)/100")
print("Tier: \(report.tier.emoji) \(report.tier.rawValue)")
for dim in report.dimensions {
print(" \(dim.name): \(dim.score)")
}
for flag in report.flags {
print("โ ๏ธ \(flag.description)")
}
๐งน Smart Unsubscriber
SmartUnsubscriber is an autonomous subscription hygiene manager. It analyzes your
engagement patterns to identify feeds you should consider unsubscribing from โ keeping your
feed list lean and high-signal.
Detection Signals
| Signal | Threshold | What It Means |
|---|---|---|
| Dormant Feeds | 30+ days without new articles | Feed may be abandoned or dead |
| Ignored Feeds | < 5% read rate | You're subscribed but never reading it |
| Declining Engagement | EMA trend below 0.4 | You used to read it, but interest is fading |
| Noise Feeds | High volume, near-zero engagement | Flooding your feed with unread articles |
| Duplicate Coverage | Jaccard keyword overlap | Multiple feeds covering the same topics |
How It Works
The unsubscriber produces an UnsubscribeReport with per-feed recommendations,
confidence scores, and an overall subscription health score. Feeds recommended for unsubscription
that remain ignored are automatically muted after a configurable grace period.
API
let unsub = SmartUnsubscriber.shared
// Generate unsubscribe report
let report = unsub.analyze(
feeds: myFeeds,
readHistory: readingHistory
)
print("Subscription Health: \(report.healthScore)/100")
for rec in report.recommendations {
print("\(rec.feedTitle): \(rec.reason) (confidence: \(rec.confidence))")
}
// Auto-mute ignored recommendations
unsub.config.autoMuteEnabled = true
// Listen for new reports
NotificationCenter.default.addObserver(
forName: .unsubscribeReportDidUpdate, ...
)
๐ How They Work Together
These six systems form an integrated intelligence layer:
- Anomaly Detector flags compromised or failing feeds โ triggers trust score decay
- Credibility Scorer evaluates source quality โ informs priority ranking
- Smart Unsubscriber identifies low-value subscriptions โ suggests cleanup
- Diversity Auditor checks for echo chambers โ recommends new perspectives
- Reading Coach optimizes your reading habits โ suggests best times and topics
- Forgetting Curve tracks memory retention โ surfaces timely refreshers
Together they continuously refine your reading experience โ keeping subscriptions healthy, sources trustworthy, perspectives diverse, habits productive, and knowledge retained.