{"id":47906287,"url":"https://github.com/bintangtimurlangit/newsroom","last_synced_at":"2026-04-04T04:52:21.848Z","repository":{"id":347863531,"uuid":"1195528915","full_name":"bintangtimurlangit/newsroom","owner":"bintangtimurlangit","description":"Your agent's news desk. RSS feeds, push or digest alerts, presets included, and on-demand briefings.","archived":false,"fork":false,"pushed_at":"2026-03-29T21:20:15.000Z","size":155,"stargazers_count":0,"open_issues_count":6,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-29T21:23:40.072Z","etag":null,"topics":["aggregator","news","openclaw","openclaw-plugin","rss"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bintangtimurlangit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"bintangtimurlangit"}},"created_at":"2026-03-29T19:16:53.000Z","updated_at":"2026-03-29T21:19:03.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/bintangtimurlangit/newsroom","commit_stats":null,"previous_names":["bintangtimurlangit/newsroom"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/bintangtimurlangit/newsroom","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bintangtimurlangit%2Fnewsroom","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bintangtimurlangit%2Fnewsroom/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bintangtimurlangit%2Fnewsroom/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bintangtimurlangit%2Fnewsroom/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bintangtimurlangit","download_url":"https://codeload.github.com/bintangtimurlangit/newsroom/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bintangtimurlangit%2Fnewsroom/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31388169,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T04:26:24.776Z","status":"ssl_error","status_checked_at":"2026-04-04T04:23:34.147Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aggregator","news","openclaw","openclaw-plugin","rss"],"created_at":"2026-04-04T04:52:21.031Z","updated_at":"2026-04-04T04:52:21.840Z","avatar_url":"https://github.com/bintangtimurlangit.png","language":"TypeScript","funding_links":["https://github.com/sponsors/bintangtimurlangit"],"categories":[],"sub_categories":[],"readme":"# Newsroom\n\n[![npm](https://img.shields.io/npm/v/@bintangtimurlangit/newsroom?style=flat-square)](https://www.npmjs.com/package/@bintangtimurlangit/newsroom)\n[![Build and verify](https://github.com/bintangtimurlangit/newsroom/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/bintangtimurlangit/newsroom/actions/workflows/ci.yml)\n[![platforms](https://img.shields.io/badge/platforms-macOS%20%7C%20Linux%20%7C%20Windows-4a90d9?style=flat-square)](./docs/DEVELOPMENT.md)\n[![license](https://img.shields.io/github/license/bintangtimurlangit/newsroom?style=flat-square)](./LICENSE)\n\nYour 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.\n\n**Stop treating RSS like homework.**\n\n- **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).\n- **Dial the noise** — Per feed: **instant** alerts, **periodic** digests, or **manual** fetch only.\n- **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`.\n- **No duplicate spam** — SQLite-backed tracking remembers what was already sent.\n\nBuilt 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.\n\n**Full reference:** [Documentation](./docs/README.md) (installation, configuration, tools, CLI, architecture, development). **Changelog:** [CHANGELOG.md](./CHANGELOG.md).\n\n---\n\n## Prerequisites\n\n- **Node.js ≥ 22.5.0** — Required for built-in [`node:sqlite`](https://nodejs.org/api/sqlite.html). Check with `node -v`.\n- **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.\n\n---\n\n## Installation\n\n### Install with an AI assistant\n\n\u003e \"Hey, please install this https://github.com/bintangtimurlangit/newsroom , and set it up for me\"\n\nPaste 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.\n\n### Manual installation\n\nDo this yourself (no coding agent). More detail: **[docs/INSTALLATION.md](./docs/INSTALLATION.md)**.\n\n**From npm (published package)**\n\n1. Confirm **Node.js ≥ 22.5** and that the **`openclaw`** CLI runs on this machine.\n2. Install the plugin and restart the gateway:\n\n   ```bash\n   openclaw plugins install @bintangtimurlangit/newsroom\n   openclaw gateway restart\n   ```\n\n3. 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.\n4. Optional: **`openclaw plugins doctor`** to confirm Newsroom loads without issues.\n\n**From a local clone (development)**\n\n1. Clone the [repository](https://github.com/bintangtimurlangit/newsroom), then install deps and build:\n\n   ```bash\n   git clone https://github.com/bintangtimurlangit/newsroom.git\n   cd newsroom\n   npm install\n   npm run build\n   ```\n\n2. 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.\n3. Restart the gateway, then run **`openclaw newsroom-setup`** (or set the session key manually) as in **From npm** step 3.\n\n### CLI install\n\n```bash\nopenclaw plugins install @bintangtimurlangit/newsroom\nopenclaw gateway restart\n```\n\nThe 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.\n\n### First-time setup (where pushes go)\n\nNewsroom 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).\n\n**Resolution order** (first match wins):\n\n1. `plugins.entries.newsroom.config.notificationSessionKey` in `openclaw.json`\n2. Environment variable **`NEWSROOM_NOTIFICATION_SESSION_KEY`**\n3. Local **`setup.json`** under your state dir: `\u003cstateDir\u003e/plugins/newsroom/setup.json` (written by the command below)\n\n**Interactive setup** (writes `setup.json` and, by default, merges into `openclaw.json`):\n\n```bash\nopenclaw newsroom-setup\n# or non-interactive:\nopenclaw newsroom-setup --session-key main\n```\n\nBefore 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.\n\nUse **`--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.\n\n**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.\n\n---\n\n## Features\n\n- **Multiple RSS feeds** — Add as many custom feeds as you need.\n- **Preset feeds** — Enable popular sources in one step; **[full list below](#preset-feeds)** with `presetId` for each source.\n- **Notification modes** — **Auto** (immediate when new items arrive), **periodic** (batched on a schedule), **manual** (on-demand via tools only).\n- **Per-feed settings** — Configure each feed independently.\n- **Content modes** — Full article text or headline + summary + link.\n- **Deduplication** — SQLite-backed tracking avoids sending the same article twice.\n- **Background polling** — Scheduler runs for **auto** and **periodic** feeds while the gateway is up.\n- **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.\n\n---\n\n## Usage (agent tools)\n\n### Enable preset feeds\n\n```javascript\nnewsroom_enable_preset({ presetId: \"techcrunch\" })\nnewsroom_enable_preset({ presetId: \"bbcnews\" })\n```\n\n### Add a custom RSS feed\n\n```javascript\nnewsroom_add_feed({\n  url: \"https://example.com/feed.xml\",\n  name: \"My Custom Feed\",\n  notificationMode: \"periodic\", // \"auto\", \"periodic\", or \"manual\"\n  contentMode: \"summary\", // \"full\" or \"summary\"\n  periodicIntervalHours: 12,\n})\n```\n\n### List configured feeds\n\n```javascript\nnewsroom_list_feeds()\n```\n\n### Fetch news on demand\n\n```javascript\nnewsroom_get_news()\nnewsroom_get_news({ feedId: 1 })\n```\n\n### Update feed settings\n\n```javascript\nnewsroom_update_feed_settings({\n  feedId: 1,\n  notificationMode: \"auto\",\n  contentMode: \"full\",\n})\n```\n\n### Disable a preset or remove a feed\n\n```javascript\n// Preset feeds: disable by feed id from newsroom_list_feeds\nnewsroom_disable_preset({ feedId: 1 })\n// Any feed (including custom):\nnewsroom_remove_feed({ feedId: 1 })\n```\n\n### Feed status\n\n```javascript\nnewsroom_get_feed_status()\n```\n\n**Parameter details and tool list:** [docs/TOOLS.md](./docs/TOOLS.md).\n\n---\n\n## Preset feeds\n\n| Category | Name | Preset ID |\n|----------|------|-----------|\n| Tech | TechCrunch | `techcrunch` |\n| Tech | Ars Technica | `arstechnica` |\n| Tech | The Verge | `theverge` |\n| News | BBC News | `bbcnews` |\n| News | Reuters | `reuters` |\n| News | AP News | `apnews` |\n| AI/Tech | Hacker News | `hn` |\n| AI/Tech | AI Weekly | `aiweekly` |\n| General | NPR | `npr` |\n| General | Al Jazeera | `aljazeera` |\n\n---\n\n## Configuration\n\nPlugin options live under **`plugins.entries.newsroom.config`**. Defaults apply when fields are omitted.\n\n| Field | Description |\n|-------|-------------|\n| `pollingIntervalMinutes` | How often the gateway polls **auto** feeds (1–60). |\n| `defaultNotificationMode` | Default for new feeds: `auto`, `periodic`, or `manual`. |\n| `defaultPeriodicIntervalHours` | Default hours between **periodic** batches (1–168). |\n| `defaultContentMode` | `summary` or `full` for new feeds. |\n| `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. |\n\n```json\n{\n  \"plugins\": {\n    \"entries\": {\n      \"newsroom\": {\n        \"enabled\": true,\n        \"config\": {\n          \"pollingIntervalMinutes\": 5,\n          \"defaultNotificationMode\": \"periodic\",\n          \"defaultPeriodicIntervalHours\": 12,\n          \"defaultContentMode\": \"summary\",\n          \"notificationSessionKey\": \"YOUR_SESSION_KEY_HERE\"\n        }\n      }\n    }\n  }\n}\n```\n\nMore detail: [docs/CONFIGURATION.md](./docs/CONFIGURATION.md).\n\n---\n\n## Roadmap\n\n- **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.\n\n---\n\n## Development\n\n```bash\nnpm install\nnpm run build\nnpm test\nnpm run test:coverage\nnpm run verify\n```\n\nUse **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.\n\nNode may print **`ExperimentalWarning: SQLite is an experimental feature`** until the API stabilizes; it is safe to ignore for normal use.\n\nTo 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).\n\n## Contributing \u0026 security\n\n[CONTRIBUTING.md](./CONTRIBUTING.md) · [SECURITY.md](./SECURITY.md) · [Code of Conduct](./CODE_OF_CONDUCT.md)\n\n## License\n\n[MIT](./LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbintangtimurlangit%2Fnewsroom","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbintangtimurlangit%2Fnewsroom","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbintangtimurlangit%2Fnewsroom/lists"}