Boundary: Schedule plugins only emit candidate URLs. Ingest is Source plugins (pin via
sourcePluginIdor auto-match). Product guide: Schedules.
Schedule plugins
Shares
plugin-kit(namespace=schedule).
Writing a plugin? → Schedule plugin development
Goal
Pull “where candidates come from” out of the scheduler:
- Core: cron + dedupe + create jobs
- Plugins: RSS, charts, third-party APIs, custom sources
Architecture
text
apps/server/src/services/schedule/plugins/
types.ts / registry.ts / loader.ts / host.ts / config/state
storage/plugins/schedule/<dir>/
plugin.json
index.jsBuilt-in plugins
| id | Role | Default |
|---|---|---|
schedule.rss | RSS/Atom | on |
schedule.url-list | Fixed URL list | on |
(Also shipping built-ins such as GitHub Trending / Hacker News — see Settings and MCP list_schedule_plugins.)
Unified model (Settings → Schedules)
Each row is plugin + params + cadence — no special-case “is this a plugin?”.
Product guide: Schedules.
Install examples
bash
cp -R examples/schedule-plugin-github-trending \
storage/plugins/schedule/github-trending