Quality & Reliability

Every pipeline now returns validated structured news: title, factual summary, optional AI analysis, publication date and source IDs. Native citation/retrieval metadata supplies the clickable source links. Unknown source IDs, unsafe links, malformed JSON and truncated responses cannot become successful news items.

Publication dates

The News time window applies to all providers. New installs default to d1 (last 24 hours); existing date ranges are preserved. Unknown dates are excluded by default. Enable “Include news without publication dates” to retain them with a warning. Dates taken from source metadata and dates reported by the model have separate labels. A date without a time is treated as a calendar-day interval and cannot prove exact 24-hour freshness. These checks verify source membership and dates, not the truth of every claim.

Calls, retries and limits

Native search normally uses two model calls per topic: research with native sources, followed by structured formatting without tools. Sonar can search again during formatting. RSS + Gemini needs one non-search model call per topic. Configure output-token limits, timeouts, up to two retries for explicit throttling/server errors, and search-call limits where supported. Google grounding and Grok may not enforce a hard search-count cap. Retries may be billable; Obsidian HTTP timeouts stop waiting but cannot cancel remote work.

Optional API usage in notes shows reported generation metadata, including cached generation metadata when reused. Unreported counts, retriever/query/judge calls and failed/retried calls can be missing. It is not a currency budget or bill estimate. No automatic model/provider fallback is used.

Failures and caches

Empty results and API errors are distinct. Failed, empty and partial-feed results are not cached. Successful caches include content settings and are checked against the moving time window before reuse. Run Retry news generation (save a new note) to preserve the original note while retrying. Custom prompts can guide editorial choices; the JSON/source/time contract and renderer still control output. Custom note templates are supported.

Validation

npm test runs offline fixtures for all six providers, malformed citations/dates, freshness, cache invalidation, retries and note preservation. CI runs tests and a TypeScript production build on pull requests, branch pushes and releases. Real API availability and account quotas require an account-level connection test.

Advanced

Google Search Optimization

When using Google providers, the plugin runs 5 parallel search strategies per topic:

StrategyPurpose
OptimizedAI-generated query with optimal keywords
SpecificExact phrase matching for precision
BroadWide search for comprehensive coverage
RecentTime-filtered for latest developments
SimpleBasic query as fallback

Results are deduplicated, filtered by quality sources (BBC, Reuters, TechCrunch, Bloomberg, etc.), and ranked by AI.

Caching

Two levels of caching reduce API usage and speed up generation:

  • Query Cache: Persists AI-generated search queries per topic. Cleared manually.
  • Daily Content Cache: Caches processed content per topic per day. Auto-cleaned on next day. Can be disabled in Advanced settings if you always want fresh results.

Performance Tips

GoalRecommendation
SpeedAgentic providers, fewer results per topic, concise format
CostRSS + Gemini summaries, lower output limits, and fewer results
QualityEnable AI queries + AI judge, increase results per topic, use custom prompts
CoverageResults per topic 10–15, max search 40–50, broader date range

API Rate Limits

ProviderFree TierPaid
Google Custom Search100 queries/day$5 per 1,000
GeminiProject-specific model and tool quotasPay-as-you-go
OpenAI / Anthropic / GrokNo free tierPay-per-use
PerplexityNo free tierSubscription
OpenRouterNo free tierVaries by model
Each topic may trigger model calls and search queries. Gemini 3.8 Flash supports free API text summaries, but Search grounding requires billing. Legacy Gemini 2.5 Flash free Search is restricted to eligible existing users and project quotas. Check your actual limits in Google AI Studio.

Architecture

graph TD A[Plugin Main] --> B[News Provider Factory] B --> C1[Agentic Providers] B --> C2[Search-Summarize Coordinator] C1 --> D1[Perplexity] C1 --> D2[GPT Agentic] C1 --> D3[Claude Agentic] C1 --> D4[Grok Agentic] C1 --> D5[Gemini Agentic] C1 --> D6[OpenRouter Agentic] C2 --> E1[Retrievers] C2 --> E2[Summarizers] E1 --> F1[Google Search] E1 --> F2[RSS] E2 --> G1[Gemini] E2 --> G2[GPT] E2 --> G3[Claude] E2 --> G4[Grok] E2 --> G5[OpenRouter] A --> H[Template Engine] style A fill:#a855f7,stroke:#d8b4fe,color:#fff style B fill:#3b82f6,stroke:#93c5fd,color:#fff style H fill:#22c55e,stroke:#86efac,color:#fff

Design Patterns

PatternImplementation
FactoryNewsProviderFactory — creates providers from settings
StrategyAgentic vs Modular pipeline selection
TemplateTemplateEngine — placeholder rendering
Abstract BaseBaseNewsProvider, BaseRetriever, BaseSummarizer

File Structure

src/
  types.ts                    # Type definitions & settings
  constants.ts                # Translations & constants
  utils.ts                    # FileUtils, LanguageUtils, ContentUtils, MetadataUtils
  settings-tab.ts             # Settings UI
  providers/
    base-news-provider.ts     # Abstract base class
    news-provider-factory.ts  # Factory
    agentic/                  # Perplexity, GPT, Claude, Grok, OpenRouter, Gemini
    coordinators/             # Search-Summarize coordinator
    retrievers/               # Google Search, RSS, Perplexity Search
    summarizers/              # Gemini, GPT, Claude, Grok, OpenRouter
  template/
    template-engine.ts        # Rendering engine
    template-presets.ts       # Template preset definitions

Contributing

Development Setup

git clone https://github.com/ChenziqiAdam/Daily-News-Briefing.git
cd Daily-News-Briefing
npm install
npm run dev    # Watch mode
npm run build  # Production build

Testing

  1. Run npm test and npm run build
  2. Copy main.js, manifest.json, styles.css to your vault's .obsidian/plugins/daily-news-briefing/
  3. Reload Obsidian (Ctrl/Cmd+R)

Adding a New Provider

Agentic Provider
  1. Create src/providers/agentic/your-provider.ts
  2. Extend BaseNewsProvider, implement fetchAndSummarizeNews(topic): Promise<BriefingResult>
  3. Register in NewsProviderFactory
  4. Add settings UI and types
Summarizer
  1. Create src/providers/summarizers/your-summarizer.ts
  2. Extend BaseSummarizer, implement summarize(topic, articles, language)
  3. Register in coordinator factory

Pull Requests

  1. Fork and create a feature branch
  2. Ensure npm run build passes
  3. Test in Obsidian
  4. Submit PR with description and testing notes
Good First Issues: Add language translations, create template presets, improve error messages, add placeholders, or enhance docs.

Need more help?

Report an Issue View on GitHub Support Development