Qoc

News and RSS

Ingest news headlines and RSS feeds into the workspace inbox and onto tracked entity files, with automatic deduplication.


The news and RSS capability polls configured feeds on a schedule, deduplicates headlines, writes new items to inbox/news/, and appends relevant headlines to the [news] section of matching entity files so the agent always has current context when researching a symbol.

How ingestion works

Each configured feed is polled at its defined interval. New items are compared against a local deduplication index keyed by a hash of the item URL and title. Items that have already been ingested are skipped. New items are written as individual Markdown files into inbox/news/ with a filename that encodes the publication timestamp and a slug of the title.

If an item's title or description contains a symbol or company name that matches a tracked entity, a reference to that item is also appended to the entity's [news] section. This means when the agent opens an entity file to research a company, the most recent relevant headlines are already there alongside the fundamentals.

Feed configuration in desk.toml

Configuring RSS feeds and news provider feeds
toml
[data_hub.news]
# Poll interval applied to all feeds unless overridden per feed.
default_poll_interval_s = 300

# RSS feeds — any public RSS or Atom URL.
[[data_hub.news.feeds]]
name    = "financial-times-markets"
url     = "https://www.ft.com/rss/home/markets"
tags    = ["macro", "equities"]

[[data_hub.news.feeds]]
name    = "sec-edgar-filings"
url     = "https://www.sec.gov/cgi-bin/browse-edgar?action=getcurrent&type=8-K&dateb=&owner=include&count=20&output=atom"
tags    = ["filings", "8-K"]
poll_interval_s = 900

# Provider-based news — uses your configured data provider's news API.
[[data_hub.news.provider_feeds]]
kind   = "market-data-primary"
topics = ["earnings", "mergers", "guidance"]
entities = "all-tracked"   # pull news for every tracked entity

Inbox news file fields

FieldDescription
sourceFeed name as configured in desk.toml.
published_atISO 8601 timestamp of the original publication.
titleHeadline text.
summaryFirst paragraph or RSS <description> field.
urlCanonical URL of the original article.
tagsTags inherited from the feed config, plus any auto-tagged entity slugs.
ingested_atTimestamp when Qoc wrote the file to the workspace.

Deduplication across feed restarts

The deduplication index persists across qoc up / qoc down cycles. If you restart the Data Hub, previously ingested items will not re-appear in inbox/news/. The index is stored in .qoc/news-dedup.db inside the workspace.

Entity-level news tagging

When a headline is ingested, Qoc runs a lightweight symbol-matching pass over the title and summary text. If it finds a match against any symbol or alias in entities/, it appends a reference to the entity file's [news] table. The reference includes the publication timestamp, title, and the path to the full item in inbox/news/.

This means the agent does not need to search the inbox for relevant news when researching a company — the entity file acts as an index of the most recent items. The [news] section in an entity file holds the last N references (default 20, configurable per entity).

Ask the agent to summarize overnight news

A useful morning workflow: run qoc run 'summarize inbox/news since yesterday and flag anything affecting tracked positions'. The agent scans the inbox, reads each item, cross-references positions in the UTA snapshot, and writes a concise briefing to research/morning-brief-<date>.md.