๐Ÿงญ Reader Intelligence & Productivity

FeedReader's reader intelligence layer transforms passive RSS consumption into an active, optimized information workflow. These 12 autonomous engines monitor your attention, detect blind spots, fact-check claims across sources, track evolving narratives, predict your future interests, and curate optimal reading sessions โ€” all on-device with zero external API calls.

On This Page

๐Ÿ“Š Overview & Architecture

These 12 engines form the Reader Intelligence tier of FeedReader's autonomous system. While the Feed Intelligence layer focuses on feed-level hygiene (diversity auditing, anomaly detection, credibility), Reader Intelligence operates at the reader level โ€” understanding how you read, what you're missing, and how to optimize your information diet.

Engine Lines Purpose Key Output
FeedAttentionAllocator 658 Attention budget management & sink detection Diversity score, attention efficiency, reallocation suggestions
FeedBlindSpotDetector 747 Systematic reading gap identification Portfolio health score, blind spots with severity, insights
FeedEditorialDriftCompass 841 Feed editorial identity change detection Drift score, drift type classification, predictions
FeedCrossReferenceEngine 1,421 Cross-article fact corroboration & contradiction Claim provenance, corroboration level, fleet reliability score
FeedNarrativeArcTracker 742 Developing storyline detection & phase tracking Narrative phase, turning points, convergence alerts
FeedPredictiveInterestEngine 850 Future interest forecasting before explicit search Interest trajectories, surfaced articles, prediction accuracy
FeedContextualPrimer 521 Pre-reading preparation & knowledge scaffolding Readiness score, familiarity map, optimal reading order
FeedContentCalendar 622 Publication schedule detection & gap alerts Schedule pattern, day profiles, late/missing content alerts
FeedSentimentRadar 620 Lexicon-based sentiment tracking & mood shift alerts Article sentiment scores, feed summaries, shift alerts
FeedReadingAutopilot 818 Optimal reading session curation with time budgets Curated playlist, diversity score, cognitive load curve
FeedSubscriptionROI 784 Per-feed return-on-investment analysis ROI tiers, anti-patterns, prune/promote recommendations
FeedTrendForecaster 465 Emerging trend detection & breakout prediction Trend signals, momentum, breakout probability, alerts

Total: 9,089 lines of autonomous reader intelligence code.

๐ŸŽฏ Attention Allocator

FeedAttentionAllocator โ€” 658 lines

Tracks how your reading attention is distributed across topics and sources, detects "attention sinks" (patterns that waste your time), manages per-topic budgets, and proactively reallocates attention to maximize information diversity and value.

Attention Sink Types

SinkEnum ValueDescription
๐Ÿฐ Rabbit Hole.rabbitHoleDeep-diving into a single topic excessively, losing sight of other areas
๐Ÿ“ฑ Doom Scroll.doomScrollConsuming content from one source for too long without switching
๐Ÿ” Echo Chamber.echoChamberReading the same perspective repeatedly, missing diverse viewpoints
โœจ Novelty Trap.noveltyTrapShallow scanning across many topics without meaningful engagement
๐Ÿ˜‘ Obligation Read.obligationReadSpending time on content that provides low engagement or value

Severity Levels

Each detected sink is classified by severity: .mild, .moderate, .significant, or .severe โ€” enabling graduated response from gentle nudges to urgent reallocation suggestions.

Usage

let allocator = FeedAttentionAllocator()

let report = allocator.analyze(
    records: attentionRecords,
    customBudgets: myBudgets     // optional per-topic budgets
)

print(report?.diversityScore)      // 0-100 Shannon entropy-based
print(report?.attentionEfficiency) // 0-100 engagement-weighted
print(report?.sinks)               // detected attention traps
print(report?.reallocations)       // suggested attention shifts
print(report?.overallVerdict)      // human-readable summary

Key Outputs

๐Ÿ” Blind Spot Detector

FeedBlindSpotDetector โ€” 747 lines

Identifies systematic gaps in your reading habits โ€” topics and domains adjacent to your interests but consistently missing from your feeds. Uses keyword co-occurrence analysis, Shannon entropy per topic, and temporal pattern detection.

Blind Spot Categories

CategoryEnum ValueDescription
๐Ÿ”— Adjacent Gap.adjacentTopics frequently co-occurring with your interests but absent from your feeds
๐Ÿ” Echo Chamber.echoChamberTopics covered only from a single perspective
โณ Temporal Decay.temporalTopics you once read about but have abandoned
๐Ÿ“Š Depth Imbalance.depthImbalanceRelated topics covered at dramatically different depths
๐Ÿ†• Emerging Miss.emergingNewly trending topics in your interest space that you haven't noticed

Usage

let detector = FeedBlindSpotDetector()

detector.ingest(BlindSpotArticle(
    id: "1", title: "Intro to ML",
    topics: ["machine learning", "neural networks"],
    feedURL: "https://blog.example.com/feed",
    feedName: "Tech Blog",
    readDate: Date(),
    sourcePerspective: "tech"))

let report = detector.analyze()
print(report.healthScore)       // 0-100 portfolio health
print(report.blindSpots)        // detected gaps with severity
print(report.insights)          // autonomous observations

Scoring

Each blind spot receives a composite severity score (0-100) weighted by category base severity: echo chambers score highest (0.9), followed by emerging misses (0.8), adjacent gaps (0.7), depth imbalances (0.6), and temporal decay (0.5). The overall portfolio health score translates to letter grades (A through F).

๐Ÿงญ Editorial Drift Compass

FeedEditorialDriftCompass โ€” 841 lines

Monitors feed sources for silent topic shifts. Detects when a feed's content diverges from its established editorial identity โ€” for example, a tech blog starting to cover politics, or a science feed drifting toward opinion pieces.

Drift Type Classification

Drift TypeEnum ValueDescription
๐Ÿด Topic Invasion.topicInvasionNew topics appearing that weren't part of the feed's identity
๐ŸŒŠ Identity Erosion.identityErosionCore topics that defined the feed are fading away
๐Ÿ”„ Pivot.pivotFeed is deliberately pivoting to a different focus area
๐Ÿ’จ Dilution.dilutionFeed losing focus by covering too many unrelated topics
โœ… Stable.stableFeed maintains consistent editorial identity

Usage

let compass = FeedEditorialDriftCompass()

compass.ingestArticle(
    feedURL: "https://techblog.com/feed",
    title: "New iPhone Review",
    topics: ["technology", "mobile", "apple"])

let report = compass.analyzeDrift(feedURL: "https://techblog.com/feed")
print(report.driftScore)         // 0-100 how much it has drifted
print(report.driftType)          // .topicInvasion, .identityErosion, etc.
print(report.invadingTopics)     // topics not part of original identity
print(report.erodingTopics)      // original topics that are fading
print(report.prediction)         // projected identity in 30 days

Key Capabilities

๐Ÿ”— Cross-Reference Engine

FeedCrossReferenceEngine โ€” 1,421 lines

The largest engine in FeedReader's intelligence suite. Extracts factual claims from articles (numbers, dates, percentages, named entities, statistics, attributions, causal statements) and cross-references them across sources to find corroborations, contradictions, and uncorroborated assertions.

Claim Types

TypeEnum ValueExample
Numeric.numeric"500 million users"
Percentage.percentage"grew 35%"
Monetary.monetary"$2.5 billion acquisition"
Temporal.temporal"launched in March 2026"
Entity.entity"Apple", "Elon Musk", "EU"
Statistic.statistic"doubled year-over-year"
Attribution.attribution"CEO stated thatโ€ฆ"
Causal.causal"tariffs caused price increases"

Corroboration Levels

LevelDescription
.strongConsensus3+ sources agree on the claim
.corroborated2 sources agree
.uncorroboratedSingle source only โ€” treat with caution
.disputedSources disagree mildly
.contradictedSources directly conflict

Autonomous Notifications

The engine posts NSNotification alerts in real time:

Key Capabilities

๐Ÿ“– Narrative Arc Tracker

FeedNarrativeArcTracker โ€” 742 lines

Detects developing storylines across articles over time. Identifies when stories are emerging, building momentum, reaching climax, or resolving โ€” and alerts users when stories they follow reach key turning points.

Narrative Phases

PhaseDescription
.emergingFew initial articles โ€” story just appearing
.risingGrowing coverage, building momentum
.climaxPeak coverage, highest intensity
.fallingCoverage declining, aftermath period
.resolutionStory concluded or settled
.dormantNo activity for extended period

Turning Point Types

The tracker detects 8 types of turning points: .emergence, .accelerating, .peakReached, .sentimentShift, .newActor, .convergence, .reversal, and .resolution.

Autonomous Notifications

Key Capabilities

๐Ÿ”ฎ Predictive Interest Engine

FeedPredictiveInterestEngine โ€” 850 lines

Forecasts your future reading interests before you explicitly search for them. Analyzes interest trajectory vectors, detects emerging curiosity signals, and proactively surfaces articles aligned with predicted interests.

Interaction Types & Signal Weights

InteractionWeightMeaning
.search1.0Actively searched for โ€” strongest signal
.bookmark0.9Saved for later โ€” high intent
.share0.85Shared externally โ€” strong engagement
.highlight0.8Highlighted text โ€” deep engagement
.read0.7Full article read
.skim0.3Quick scan (<30s)
.click0.2Clicked but bounced

Interest Lifecycle Phases

Each tracked interest moves through phases: .latent โ†’ .emerging โ†’ .growing โ†’ .peak โ†’ .stable โ†’ .waning โ†’ .dormant. The engine measures velocity (first derivative) and acceleration (second derivative) of interest trajectories to detect emerging curiosity before it becomes conscious.

Usage

let engine = FeedPredictiveInterestEngine()

engine.recordInteraction(
    topic: "machine learning",
    feedURL: "https://blog.ai/feed",
    articleId: "a1",
    interactionType: .read,
    dwellSeconds: 180,
    timestamp: Date())

let forecast = engine.forecast()
print(forecast.predictions)       // predicted future interests
print(forecast.surfacedArticles)  // proactively recommended articles
print(forecast.healthScore)       // 0-100 prediction quality
print(forecast.insights)          // autonomous observations

Key Capabilities

๐Ÿ“š Contextual Primer

FeedContextualPrimer โ€” 521 lines

Prepares you before diving into an article by analyzing it against your reading history. Produces a contextual primer with background refreshers, concept familiarity mapping, knowledge readiness scoring, and optimal reading order suggestions.

Familiarity Levels

LevelExposureWeight
.unknownNever seen0.0
.glimpsedSeen 1-2 times0.3
.familiarSeen 3-7 times0.7
.wellKnownSeen 8+ times1.0

Usage

let primer = FeedContextualPrimer()

// Register reading history
primer.recordReading(story: someStory)

// Get a primer for a new article
let brief = primer.preparePrimer(for: targetStory)
print(brief.readinessScore)         // 0-100 knowledge readiness
print(brief.backgroundRefreshers)   // related past articles
print(brief.blindSpots)             // concepts you haven't seen
print(brief.familiarityMap)         // term โ†’ familiarity level

// Optimal reading order for queued articles
let order = primer.suggestReadingOrder(for: queuedStories)

Key Capabilities

๐Ÿ“… Content Calendar

FeedContentCalendar โ€” 622 lines

Analyzes when feeds publish articles, detects regular schedules, predicts upcoming publications, and alerts when expected content is late or missing.

Schedule Patterns

PatternDescription
.dailyPublishes daily
.weekdaysPublishes on weekdays
.weeklyPublishes weekly
.biweeklyPublishes every two weeks
.sporadicIrregular schedule
.inactiveNo recent activity

Key Capabilities

๐Ÿ“ก Sentiment Radar

FeedSentimentRadar โ€” 620 lines

Lexicon-based sentiment tracking across RSS feeds. Analyzes article tone, detects mood shifts over time, and generates proactive alerts when sentiment changes significantly.

Sentiment Polarity Scale

PolarityNumeric Value
.veryNegative-1.0
.negative-0.5
.neutral0.0
.positive+0.5
.veryPositive+1.0

Key Outputs

โœˆ๏ธ Reading Autopilot

FeedReadingAutopilot โ€” 818 lines

Curates optimal article sequences given a time budget. Considers priority scoring, reading time estimates, topic diversity, cognitive load balancing, and reading momentum to produce sessions that start accessible, build complexity, and wind down gracefully.

Cognitive Load Levels

LevelWeightDescription
โ˜๏ธ .light1.0Quick, easy reads
โš– .moderate2.0Standard complexity
๐Ÿ‹๏ธ .heavy3.0Dense, technical content
๐Ÿง  .dense4.0Maximum cognitive demand

Session Moods

Choose a session mood: .relaxed (prefer light content), .balanced (mix of everything), .focused (deep reads), or .exploratory (maximize topic diversity).

Usage

let autopilot = FeedReadingAutopilot()

let session = autopilot.planSession(
    articles: allArticles,
    timeBudgetMinutes: 20,
    preferences: .default)

print(session.playlist)          // ordered article list
print(session.totalMinutes)      // estimated total time
print(session.diversityScore)    // topic variety 0-100
print(session.cognitiveProfile)  // load curve description
print(session.sessionBrief)      // human-readable summary

๐Ÿ’ฐ Subscription ROI

FeedSubscriptionROI โ€” 784 lines

Measures the value each feed delivers relative to the attention it demands. Computes per-feed ROI scores based on engagement metrics (read rate, dwell time, save/share actions), content volume, and quality signals.

ROI Tiers

TierScore RangeMeaning
๐Ÿ† Platinum85-100Exceptional value โ€” your best subscriptions
๐Ÿฅ‡ Gold70-84High value โ€” consistently worthwhile
๐Ÿฅˆ Silver50-69Moderate value โ€” decent but room for improvement
๐Ÿฅ‰ Bronze30-49Low value โ€” consider adjusting consumption
๐Ÿ“‰ Deficit0-29Negative ROI โ€” candidate for unsubscription

Anti-Pattern Detection

The engine detects 6 subscription anti-patterns: zombie feed (publishes but you never read), firehose (overwhelms with volume), guilt sub (read out of obligation, not interest), echo redundant (duplicate of another feed), stale premium (declining quality over time), and vanity sub (subscribed for image, not engagement).

Key Outputs

๐Ÿ“ˆ Trend Forecaster

FeedTrendForecaster โ€” 465 lines

Detects emerging trends before they peak by analyzing keyword momentum across time windows, computing breakout probabilities, and generating proactive alerts for topics about to go viral.

Trend Phases

PhaseDescription
๐ŸŒฑ .emergingTopic just appearing in feeds
๐Ÿš€ .acceleratingRapidly gaining momentum across sources
๐Ÿ”ฅ .peakingMaximum coverage intensity
๐Ÿ“‰ .decliningCoverage winding down

Trend Signal

Each detected trend produces a TrendSignal containing:

Forecast Report

TrendForecast aggregates all signals with .topBreakouts (top 5 most likely to break out) and .proactiveInsights โ€” autonomous recommendations about what's worth watching.

๐Ÿ“‹ Intelligence Brief Generator

FeedIntelligenceBrief โ€” 603 lines

Generates structured daily intelligence briefings by correlating articles across feeds. Detects narrative threads, assesses signal-to-noise ratios, identifies emerging signals, and produces actionable insights.

Intelligence Priority Levels

PriorityDescription
๐Ÿ”ด .criticalImmediate attention required
๐ŸŸ  .highHigh priority โ€” review soon
๐ŸŸก .mediumNormal priority
๐Ÿ”ต .lowLow priority โ€” catch up when available
โšช .noiseBackground noise โ€” safe to skip

Brief Components

Usage

let briefer = FeedIntelligenceBrief()

let brief = briefer.generateBrief(
    articles: stories,
    feedMap: feedMap,
    previousKeywords: lastPeriodKeywords)

print(brief?.executiveSummary)
print(brief?.narrativeThreads)
print(brief?.actionableInsights)

๐Ÿ“ฐ Digest Composer

ArticleDigestComposer โ€” 62 lines (core)

Newsletter-style digest generator that composes formatted Markdown digests from article collections. Groups articles by feed source, includes reading time estimates, and supports configurable digest periods.

Digest Periods

PeriodWindow
.daily1 day
.weekly7 days
.monthly30 days

Usage

let entries = [
    DigestEntry(title: "Article One",
                feedName: "Tech Blog",
                url: "https://example.com/1",
                snippet: "An overview of...",
                readingMinutes: 5)
]

let markdown = composeDigestMarkdown(
    title: "Weekly Reading Digest",
    entries: entries,
    period: .weekly)