https://github.com/bintangtimurlangit/newsroom
Your agent's news desk. RSS feeds, push or digest alerts, presets included, and on-demand briefings.
https://github.com/bintangtimurlangit/newsroom
aggregator news openclaw openclaw-plugin rss
Last synced: about 1 month ago
JSON representation
Your agent's news desk. RSS feeds, push or digest alerts, presets included, and on-demand briefings.
- Host: GitHub
- URL: https://github.com/bintangtimurlangit/newsroom
- Owner: bintangtimurlangit
- License: mit
- Created: 2026-03-29T19:16:53.000Z (about 1 month ago)
- Default Branch: main
- Last Pushed: 2026-03-29T21:20:15.000Z (about 1 month ago)
- Last Synced: 2026-03-29T21:23:40.072Z (about 1 month ago)
- Topics: aggregator, news, openclaw, openclaw-plugin, rss
- Language: TypeScript
- Homepage:
- Size: 151 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- Funding: .github/FUNDING.yml
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
- Security: SECURITY.md
Awesome Lists containing this project
README
# Newsroom
[](https://www.npmjs.com/package/@bintangtimurlangit/newsroom)
[](https://github.com/bintangtimurlangit/newsroom/actions/workflows/ci.yml)
[](./docs/DEVELOPMENT.md)
[](./LICENSE)
Your agent shouldn’t miss the story. **Newsroom** is the news desk for OpenClaw—wire **real feeds** into **real sessions** so your agent gets breaking items, digests, or on-demand briefings **without** pasting URLs into chat all day.
**Stop treating RSS like homework.**
- **Push what matters** — New articles can hit your agent as **system events** in the session you pick (same session-key model you already use in OpenClaw).
- **Dial the noise** — Per feed: **instant** alerts, **periodic** digests, or **manual** fetch only.
- **Preset + custom** — **11 built-in presets** (TechCrunch, Hacker News, BBC News, …) via `newsroom_enable_preset`, **plus** any RSS URL. See **[Preset feeds](#preset-feeds)** for every `presetId`.
- **No duplicate spam** — SQLite-backed tracking remembers what was already sent.
Built as a **native OpenClaw plugin**: tools your agent can call, a gateway scheduler that does the polling, and a **`newsroom-setup`** CLI so “where should pushes go?” isn’t a config archaeology project.
**Full reference:** [Documentation](./docs/README.md) (installation, configuration, tools, CLI, architecture, development). **Changelog:** [CHANGELOG.md](./CHANGELOG.md).
---
## Prerequisites
- **Node.js ≥ 22.5.0** — Required for built-in [`node:sqlite`](https://nodejs.org/api/sqlite.html). Check with `node -v`.
- **OpenClaw** — The gateway and `openclaw` CLI must be installed and able to run on the same machine (or in the same environment) where you load plugins. Newsroom is an **npm package** consumed by OpenClaw; it is not a standalone app.
---
## Installation
### Install with an AI assistant
> "Hey, please install this https://github.com/bintangtimurlangit/newsroom , and set it up for me"
Paste that into your agent (or start from the [repo](https://github.com/bintangtimurlangit/newsroom)), then follow **[docs/AGENT_SETUP.md](./docs/AGENT_SETUP.md)** — copy-paste prompt for your agent; the agent should **warn you about the gateway restart**, then have you **wait a few seconds** and message **`Continue installing Newsroom`** before verification, presets, and custom feeds.
### Manual installation
Do this yourself (no coding agent). More detail: **[docs/INSTALLATION.md](./docs/INSTALLATION.md)**.
**From npm (published package)**
1. Confirm **Node.js ≥ 22.5** and that the **`openclaw`** CLI runs on this machine.
2. Install the plugin and restart the gateway:
```bash
openclaw plugins install @bintangtimurlangit/newsroom
openclaw gateway restart
```
3. Configure where **push alerts** go: run **`openclaw newsroom-setup`**, or set **`NEWSROOM_NOTIFICATION_SESSION_KEY`** / `plugins.entries.newsroom.config` in **`openclaw.json`**. See **[First-time setup](#first-time-setup-where-pushes-go)** below.
4. Optional: **`openclaw plugins doctor`** to confirm Newsroom loads without issues.
**From a local clone (development)**
1. Clone the [repository](https://github.com/bintangtimurlangit/newsroom), then install deps and build:
```bash
git clone https://github.com/bintangtimurlangit/newsroom.git
cd newsroom
npm install
npm run build
```
2. Install the plugin from that directory using OpenClaw’s **link** or **path** flow (see OpenClaw plugin docs). This repo includes **`npm run openclaw:dev:link`** (`openclaw --dev plugins install --link .`) for a dev-style install when you use a **`--dev`** OpenClaw config.
3. Restart the gateway, then run **`openclaw newsroom-setup`** (or set the session key manually) as in **From npm** step 3.
### CLI install
```bash
openclaw plugins install @bintangtimurlangit/newsroom
openclaw gateway restart
```
The CLI and gateway come from the **`openclaw`** package. Install that with **npm**, **pnpm**, **bun**, or another Node-compatible client. **Homebrew** (or similar) may ship **OpenClaw** itself; this plugin is an **npm package** loaded via `openclaw plugins install`, not a separate brew formula unless you maintain one.
### First-time setup (where pushes go)
Newsroom needs an **OpenClaw session key** so `enqueueSystemEvent` can deliver new-article alerts to the right agent session (same idea as the session/channel key you use elsewhere in OpenClaw).
**Resolution order** (first match wins):
1. `plugins.entries.newsroom.config.notificationSessionKey` in `openclaw.json`
2. Environment variable **`NEWSROOM_NOTIFICATION_SESSION_KEY`**
3. Local **`setup.json`** under your state dir: `/plugins/newsroom/setup.json` (written by the command below)
**Interactive setup** (writes `setup.json` and, by default, merges into `openclaw.json`):
```bash
openclaw newsroom-setup
# or non-interactive:
openclaw newsroom-setup --session-key main
```
Before updating **`openclaw.json`**, the setup command checks that the **`openclaw` npm package** is resolvable from the plugin (same install graph as a normal OpenClaw install). If you only have the plugin sources without OpenClaw next to it, use **`--no-write-config`** to write **`setup.json`** only, or install OpenClaw first.
Use **`--no-write-config`** to only write `setup.json` (no change to `openclaw.json`). **Restart the gateway** after changing config so the plugin reloads merged settings.
**Dedicated agent:** OpenClaw does not expose a stable “create agent” API for third-party plugins. If you want a separate agent for news only, add or onboard an agent using OpenClaw’s usual flows (onboarding / agent entries in config), note that agent’s session key, then run **`newsroom-setup`** with that key.
---
## Features
- **Multiple RSS feeds** — Add as many custom feeds as you need.
- **Preset feeds** — Enable popular sources in one step; **[full list below](#preset-feeds)** with `presetId` for each source.
- **Notification modes** — **Auto** (immediate when new items arrive), **periodic** (batched on a schedule), **manual** (on-demand via tools only).
- **Per-feed settings** — Configure each feed independently.
- **Content modes** — Full article text or headline + summary + link.
- **Deduplication** — SQLite-backed tracking avoids sending the same article twice.
- **Background polling** — Scheduler runs for **auto** and **periodic** feeds while the gateway is up.
- **Bundled OpenClaw skill** — With the plugin enabled, OpenClaw loads `skills/newsroom/SKILL.md` (declared in `openclaw.plugin.json`) so the model gets concise guidance for **on-demand fetches** (`newsroom_get_news`) and **adding feeds** (`newsroom_add_feed`, presets, listing feeds). Workspace skills override same-named plugin skills if you customize locally.
---
## Usage (agent tools)
### Enable preset feeds
```javascript
newsroom_enable_preset({ presetId: "techcrunch" })
newsroom_enable_preset({ presetId: "bbcnews" })
```
### Add a custom RSS feed
```javascript
newsroom_add_feed({
url: "https://example.com/feed.xml",
name: "My Custom Feed",
notificationMode: "periodic", // "auto", "periodic", or "manual"
contentMode: "summary", // "full" or "summary"
periodicIntervalHours: 12,
})
```
### List configured feeds
```javascript
newsroom_list_feeds()
```
### Fetch news on demand
```javascript
newsroom_get_news()
newsroom_get_news({ feedId: 1 })
```
### Update feed settings
```javascript
newsroom_update_feed_settings({
feedId: 1,
notificationMode: "auto",
contentMode: "full",
})
```
### Disable a preset or remove a feed
```javascript
// Preset feeds: disable by feed id from newsroom_list_feeds
newsroom_disable_preset({ feedId: 1 })
// Any feed (including custom):
newsroom_remove_feed({ feedId: 1 })
```
### Feed status
```javascript
newsroom_get_feed_status()
```
**Parameter details and tool list:** [docs/TOOLS.md](./docs/TOOLS.md).
---
## Preset feeds
| Category | Name | Preset ID |
|----------|------|-----------|
| Tech | TechCrunch | `techcrunch` |
| Tech | Ars Technica | `arstechnica` |
| Tech | The Verge | `theverge` |
| News | BBC News | `bbcnews` |
| News | Reuters | `reuters` |
| News | AP News | `apnews` |
| AI/Tech | Hacker News | `hn` |
| AI/Tech | AI Weekly | `aiweekly` |
| General | NPR | `npr` |
| General | Al Jazeera | `aljazeera` |
---
## Configuration
Plugin options live under **`plugins.entries.newsroom.config`**. Defaults apply when fields are omitted.
| Field | Description |
|-------|-------------|
| `pollingIntervalMinutes` | How often the gateway polls **auto** feeds (1–60). |
| `defaultNotificationMode` | Default for new feeds: `auto`, `periodic`, or `manual`. |
| `defaultPeriodicIntervalHours` | Default hours between **periodic** batches (1–168). |
| `defaultContentMode` | `summary` or `full` for new feeds. |
| `notificationSessionKey` | **Recommended for push alerts:** OpenClaw session key that receives **system events** when new articles arrive (auto/periodic). Without this, new-article text is only written to the plugin log. Use the same session key as the agent (see OpenClaw session docs). You can also set **`NEWSROOM_NOTIFICATION_SESSION_KEY`** or run **`openclaw newsroom-setup`** instead of editing JSON by hand. |
```json
{
"plugins": {
"entries": {
"newsroom": {
"enabled": true,
"config": {
"pollingIntervalMinutes": 5,
"defaultNotificationMode": "periodic",
"defaultPeriodicIntervalHours": 12,
"defaultContentMode": "summary",
"notificationSessionKey": "YOUR_SESSION_KEY_HERE"
}
}
}
}
}
```
More detail: [docs/CONFIGURATION.md](./docs/CONFIGURATION.md).
---
## Roadmap
- **CLI-based agent platforms** — We want setup to stay easy when installs are driven from **terminal-first coding agents** (e.g. **OpenCode**, **Claude Code**, **Gemini CLI**, **Codex**, and similar), not only from the OpenClaw UI. Planned work includes companion docs (and any thin wrappers that make sense) so flows similar to **[docs/AGENT_SETUP.md](./docs/AGENT_SETUP.md)** work smoothly in those environments. **OpenClaw remains the runtime** for the plugin; this track is about **ergonomics and discoverability** for users who live in those CLIs.
---
## Development
```bash
npm install
npm run build
npm test
npm run test:coverage
npm run verify
```
Use **Node ≥ 22.5** everywhere (OpenClaw host and this repo). Storage uses **`node:sqlite`** (built into Node) — **no** `better-sqlite3` native addon and **no** Windows C++ toolchain.
Node may print **`ExperimentalWarning: SQLite is an experimental feature`** until the API stabilizes; it is safe to ignore for normal use.
To check that OpenClaw can load this package (after `npm run build`): `npm run openclaw:dev:link` then `npm run openclaw:dev:doctor` — you should see **`No plugin issues detected.`** For end-to-end checks on a running gateway (HTTP `tools/invoke`, RSS polling, push session keys), see [docs/DEVELOPMENT.md](./docs/DEVELOPMENT.md#live-gateway-manual-checks).
## Contributing & security
[CONTRIBUTING.md](./CONTRIBUTING.md) · [SECURITY.md](./SECURITY.md) · [Code of Conduct](./CODE_OF_CONDUCT.md)
## License
[MIT](./LICENSE)