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
[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 entityInbox news file fields
| Field | Description |
|---|---|
source | Feed name as configured in desk.toml. |
published_at | ISO 8601 timestamp of the original publication. |
title | Headline text. |
summary | First paragraph or RSS <description> field. |
url | Canonical URL of the original article. |
tags | Tags inherited from the feed config, plus any auto-tagged entity slugs. |
ingested_at | Timestamp 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.