Stop scrolling. Start knowing.
Live Demo: https://clawfeed.kevinhe.io
AI-powered news digest that curates thousands of sources down to the highlights that matter. Generates structured summaries (4H/daily/weekly/monthly) from Twitter, RSS, and more. Works standalone or as an OpenClaw / Zylos skill.
- π° Multi-frequency digests β 4-hourly, daily, weekly, monthly summaries
- π‘ Sources system β Add Twitter feeds, RSS, HackerNews, Reddit, GitHub Trending, and more
- π¦ Source Packs β Share curated source bundles with the community
- π Mark & Deep Dive β Bookmark content for AI-powered deep analysis
- π― Smart curation β Configurable rules for content filtering and noise reduction
- π Follow/Unfollow suggestions β Based on feed quality analysis
- π’ Feed output β Subscribe to any user's digest via RSS or JSON Feed
- π Multi-language β English and Chinese UI
- π Dark/Light mode β Theme toggle with localStorage persistence
- π₯οΈ Web dashboard β SPA for browsing and managing digests
- πΎ SQLite storage β Fast, portable, zero-config database
- π Google OAuth β Multi-user support with personal bookmarks and sources
clawhub install clawfeedcd ~/.openclaw/skills/
git clone https://github.com/kevinho/clawfeed.gitOpenClaw auto-detects SKILL.md and loads the skill. The agent can then generate digests via cron, serve the dashboard, and handle bookmark commands.
cd ~/.zylos/skills/
git clone https://github.com/kevinho/clawfeed.gitgit clone https://github.com/kevinho/clawfeed.git
cd clawfeed
npm install# 1. Copy and edit environment config
cp .env.example .env
# Edit .env with your settings
# 2. Start the API server
npm start
# β API running on http://127.0.0.1:8767Create a .env file in the project root:
| Variable | Description | Required | Default |
|---|---|---|---|
GOOGLE_CLIENT_ID |
Google OAuth client ID | No* | - |
GOOGLE_CLIENT_SECRET |
Google OAuth client secret | No* | - |
SESSION_SECRET |
Session encryption key | No* | - |
API_KEY |
API key for digest creation | No | - |
DIGEST_PORT |
Server port | No | 8767 |
ALLOWED_ORIGINS |
Allowed origins for CORS | No | localhost |
*Required for authentication features. Without OAuth, the app runs in read-only mode.
To enable Google OAuth login:
- Go to Google Cloud Console
- Create a new project or select existing one
- Enable the Google+ API
- Create OAuth 2.0 credentials
- Add your domain to authorized origins
- Add callback URL:
https://yourdomain.com/api/auth/callback - Set credentials in
.env
All endpoints prefixed with /api/.
| Method | Endpoint | Description | Auth |
|---|---|---|---|
GET |
/api/digests |
List digests ?type=4h&limit=20&offset=0 |
- |
GET |
/api/digests/:id |
Get single digest | - |
POST |
/api/digests |
Create digest | API Key |
| Method | Endpoint | Description | Auth |
|---|---|---|---|
GET |
/api/auth/config |
Auth availability check | - |
GET |
/api/auth/google |
Start OAuth flow | - |
GET |
/api/auth/callback |
OAuth callback | - |
GET |
/api/auth/me |
Current user info | Yes |
POST |
/api/auth/logout |
Logout | Yes |
| Method | Endpoint | Description | Auth |
|---|---|---|---|
GET |
/api/marks |
List bookmarks | Yes |
POST |
/api/marks |
Add bookmark { url, title?, note? } |
Yes |
DELETE |
/api/marks/:id |
Remove bookmark | Yes |
| Method | Endpoint | Description | Auth |
|---|---|---|---|
GET |
/api/sources |
List user's sources | Yes |
POST |
/api/sources |
Create source { name, type, config } |
Yes |
PUT |
/api/sources/:id |
Update source | Yes |
DELETE |
/api/sources/:id |
Soft-delete source | Yes |
GET |
/api/sources/detect |
Auto-detect source type from URL | Yes |
| Method | Endpoint | Description | Auth |
|---|---|---|---|
GET |
/api/packs |
Browse public packs | - |
POST |
/api/packs |
Create pack from your sources | Yes |
POST |
/api/packs/:id/install |
Install pack (subscribe to its sources) | Yes |
| Method | Endpoint | Description | Auth |
|---|---|---|---|
GET |
/feed/:slug |
User's digest feed (HTML) | - |
GET |
/feed/:slug.json |
JSON Feed format | - |
GET |
/feed/:slug.rss |
RSS format | - |
| Method | Endpoint | Description | Auth |
|---|---|---|---|
GET |
/api/changelog |
Changelog ?lang=zh|en |
- |
GET |
/api/roadmap |
Roadmap ?lang=zh|en |
- |
Example Caddy configuration:
handle /digest/api/* {
uri strip_prefix /digest/api
reverse_proxy localhost:8767
}
handle_path /digest/* {
root * /path/to/clawfeed/web
file_server
}- Curation rules: Edit
templates/curation-rules.mdto control content filtering - Digest format: Edit
templates/digest-prompt.mdto customize AI output format
| Type | Example | Description |
|---|---|---|
twitter_feed |
@karpathy |
Twitter/X user feed |
twitter_list |
List URL | Twitter list |
rss |
Any RSS/Atom URL | RSS feed |
hackernews |
HN Front Page | Hacker News |
reddit |
/r/MachineLearning |
Subreddit |
github_trending |
language=python |
GitHub trending repos |
website |
Any URL | Website scraping |
digest_feed |
ClawFeed user slug | Another user's digest |
custom_api |
JSON endpoint | Custom API |
npm run dev # Start with --watch for auto-reloadcd test
./setup.sh # Create test users
./e2e.sh # Run 66 E2E tests
./teardown.sh # Clean upSee docs/ARCHITECTURE.md for multi-tenant design and scale analysis.
See ROADMAP.md or the in-app roadmap page.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
MIT License β see LICENSE for details.
Copyright 2026 Kevin He
