๐Ÿง  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

DimensionMethodWhat 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

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

  1. Posting Frequency โ€” Sudden bursts (possible spam) or droughts (feed may be dead)
  2. Content Length โ€” Articles significantly shorter or longer than the feed's baseline
  3. Topic Drift โ€” Feed suddenly covers different subjects than its established pattern
  4. Author Patterns โ€” New or missing authors that break the expected contributor profile
  5. Link Domains โ€” Articles linking to unusual or suspicious domains
  6. 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:

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

LevelRetentionAction
๐ŸŸข Stable> 60%No action needed
๐ŸŸก Weakening40โ€“60%Consider reviewing soon
๐ŸŸ  Fading20โ€“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

Coaching Insights

The coach generates actionable insights based on detected patterns:

Goal System

Set reading goals and track progress:

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

DimensionWeightWhat It Evaluates
Domain Reputation30%Curated allowlists/blocklists, TLD quality, domain age heuristics
Content Quality25%Article length, readability grade, citation presence, quote attribution
Transparency20%Author attribution, about page, contact info, correction policy
Editorial Standards15%Headline quality (clickbait detection), fact-opinion separation
Technical Trust10%HTTPS enforcement, ad density heuristics, redirect chains

Credibility Tiers

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

SignalThresholdWhat 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:

  1. Anomaly Detector flags compromised or failing feeds โ†’ triggers trust score decay
  2. Credibility Scorer evaluates source quality โ†’ informs priority ranking
  3. Smart Unsubscriber identifies low-value subscriptions โ†’ suggests cleanup
  4. Diversity Auditor checks for echo chambers โ†’ recommends new perspectives
  5. Reading Coach optimizes your reading habits โ†’ suggests best times and topics
  6. 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.