# Topic News

Topic News finds articles for the topics you choose and presents a retained journal of summaries. Its article feed supports topic filtering, a lead story and cards, pagination, and a reading pane for the selected article. Search preferences shape collection; the retained journal sets how much previously collected material remains visible.

## Set up a journal

Create **Topic News**, enter its title, and choose topics. The title is fixed at creation in this template. The managed platform search connection supplies the core search; optional Reddit, Hugging Face, and Hacker News sources can broaden collection when enabled.

Start with a few focused topics. Choose the language and search time range, set inclusion or exclusion terms where needed, and supply brief summary instructions. Run a refresh and inspect both article sources and summaries before relying on a recurring schedule. A search time range limits search discovery; it does not guarantee that every result was published during that range.

## Read and refresh

Select a topic to narrow the feed and choose an article to open its reading pane. Pagination shows an edition in manageable pages. Refreshing produces a new edition; an old page cursor should be refreshed with that edition instead of reused against changing results.

The per-run article limit controls newly collected articles processed by a refresh. Journal size controls retained history; older entries drop out when the journal exceeds its cap. Warm refreshes reuse already known articles rather than spending enrichment effort on every retained entry. Increasing journal size therefore serves a different purpose from increasing the new-article limit.

## Sources and incomplete enrichment

Some sites provide limited text or prevent retrieval. Topic News can retain a useful search snippet when full enrichment is unavailable. Source indicators and missing-image information help explain the difference between a fully retrieved article and a fallback. Open the original source before treating a summary as a precise quotation.

Transient enrichment failures have bounded retries. A later refresh can improve an incomplete entry, but repeated failures do not create an endless retry loop. A model or provider limit can reduce enrichment while still leaving a usable journal. Inspect the run and article provenance if expected detail is absent.

## Tune the result

Use inclusion and exclusion terms to reduce ambiguity, then adjust advertising and bot filters. Keep instructions specific about the audience and desired emphasis. The exposed theme setting follows the system or forces light or dark appearance. The refresh presets use UTC, independently of your profile’s timezone. Inspect the parameter reference below before expanding volume or frequency: more topics, articles, and refreshes can increase search and model usage.

<!-- catalogue-reference -->

## Parameter reference

These are the starting template’s declared parameters. Your saved app can have its own version of the schema. A default applies when no explicit value is supplied; a required field still needs a valid value.

| Setting | Accepted value | Required | Default | What it controls |
| --- | --- | --- | --- | --- |
| title (`title`) | string; minimum characters 1; maximum characters 200 | Yes | Not specified | Set at creation; read-only afterward. The app title; also woven into the provisioned workflow name. |
| Topics (`topics`) | list of string; minimum characters 1; maximum characters 100; minimum items 1; maximum items 8 | No | ["AI","Technology","Politics","Finance","Science"] | The topics the journal follows — one search per topic and source. |
| Results per topic and source (`max_results_per_topic`) | integer; minimum 1; maximum 10 | No | 5 | How many search results each source contributes per topic. |
| Articles per refresh (`max_articles_per_run`) | integer; minimum 5; maximum 60 | No | 30 | The most NEW articles a refresh crawls and summarizes (stories already in the journal are kept, not re-fetched). |
| Journal size (`journal_size`) | integer; minimum 12; maximum 90 | No | 60 | How many stories the journal keeps — new ones first, the oldest drop off. |
| Time range (`time_range`) | "day" / "week" / "month" | No | "week" | Only articles published within this window. |
| Language (`language`) | "en" / "de" / "fr" / "es" / "it" / "pt" / "nl" / "ro" | No | "en" | The language of the articles to search for. |
| Must mention (`include_terms`) | list of string; minimum characters 1; maximum characters 100; maximum items 20 | No | [] | Keep only articles whose title or snippet mentions at least one of these. |
| Never mention (`exclude_terms`) | list of string; minimum characters 1; maximum characters 100; maximum items 20 | No | [] | Drop articles whose title or snippet mentions any of these. |
| Refresh schedule (`refresh_cron`) | "hourly" / "every_6h" / "daily_07_utc" / "weekly_mon_07_utc" | No | "daily_07_utc" | How often the journal refreshes itself (UTC). |
| Summary instructions (`summary_instructions`) | string; maximum characters 500; format multiline | No | "" | Optional guidance for the summaries — tone, focus, what to leave out. |
| Filter advertisements (`filter_ads`) | boolean | No | true | Drop articles the classifier flags as ads or paid promotion. |
| Filter bot spam (`filter_bots`) | boolean | No | true | Drop articles the classifier flags as auto-generated spam. |
| Theme (`theme`) | "system" / "light" / "dark" | No | "system" | The journal's colour scheme: follow the device, or force light or dark. |


- `title`: set during creation; read-only afterwards; exposed as an app interface parameter.
- `summary_instructions`: accepts multiline text.
- `theme`: exposed as an app interface parameter.

## Connection slots

| Slot | Required | Initially enabled |
| --- | --- | --- |
| `platform_search` | Yes | Yes |
| Reddit (`reddit`) | No | No |
| Hugging Face (`huggingface`) | No | No |
| Hacker News (`hackernews`) | No | No |

Choose compatible saved connections for user-supplied slots. Managed slots are supplied by Strive. Disabling an optional slot stops its use without necessarily deleting the saved binding. See [connector policy](/docs/apps/connector-policy).

## Included workflows

| Workflow | Steps in the starting recipe | Trigger |
| --- | --- | --- |
| `news` | 32 | cron: 0 7 * * * (UTC) |

Inspect the saved app’s workflows for changes made after creation. A workflow’s presence does not mean that every interaction runs every workflow.

## Output format: news_item

One article in the topic news feed: where it came from, the model's summary, its picture, whether it is new this edition, and its display slot (seq).

| Setting | Accepted value | Required | Default | What it controls |
| --- | --- | --- | --- | --- |
| topic (`topic`) | string or null | No | Not specified | — |
| title (`title`) | string or null | No | Not specified | — |
| url (`url`) | string | Yes | Not specified | — |
| snippet (`snippet`) | string or null | No | Not specified | — |
| summary (`summary`) | string or null | No | Not specified | — |
| source (`source`) | string or null | No | Not specified | — |
| site name (`site_name`) | string or null | No | Not specified | — |
| author (`author`) | string or null | No | Not specified | — |
| published at (`published_at`) | string or null | No | Not specified | — |
| first seen at (`first_seen_at`) | string or null | No | Not specified | — |
| image url (`image_url`) | string or null | No | Not specified | — |
| thumbnail data url (`thumbnail_data_url`) | string or null | No | Not specified | — |
| is ad (`is_ad`) | boolean or null | No | Not specified | — |
| is bot (`is_bot`) | boolean or null | No | Not specified | — |
| is new (`is_new`) | boolean or null | No | Not specified | — |
| seq (`seq`) | integer or null | No | Not specified | — |


## Output format: news_run_marker

The progress of one news edition: `planned` once the run knows how many articles it will publish, `done` with the final counts and why an empty edition is empty.

| Setting | Accepted value | Required | Default | What it controls |
| --- | --- | --- | --- | --- |
| marker (`marker`) | "latest" | Yes | Not specified | — |
| stage (`stage`) | "planned" / "done" | Yes | Not specified | — |
| member step index (`member_step_index`) | integer or null | No | Not specified | — |
| known (`known`) | integer or null | No | Not specified | — |
| fresh (`fresh`) | integer or null | No | Not specified | — |
| retry (`retry`) | integer or null | No | Not specified | — |
| total (`total`) | integer or null | No | Not specified | — |
| topics (`topics`) | list of value | No | Not specified | — |
| publish (`publish`) | boolean | No | Not specified | — |
| empty reason (`empty_reason`) | string or null | No | Not specified | — |
| exclusions (`exclusions`) | object | No | Not specified | — |

