ClawFeed — AI-powered news digest with structured summaries from Twitter/RSS feeds and web dashboard
See the codeStop 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.

clawhub install clawfeed
cd ~/.openclaw/skills/
git clone https://github.com/kevinho/clawfeed.git
OpenClaw 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.git
git clone https://github.com/kevinho/clawfeed.git
cd clawfeed
npm install
# Basic usage
docker run -d -p 8767:8767 kevinho/clawfeed
# With persistent data
docker run -d -p 8767:8767 -v clawfeed-data:/app/data kevinho/clawfeed
# With environment variables (recommended for production)
docker run -d -p 8767:8767 \
-v clawfeed-data:/app/data \
-e ALLOWED_ORIGINS=https://yourdomain.com \
-e API_KEY=your-api-key \
-e GOOGLE_CLIENT_ID=your-client-id \
-e GOOGLE_CLIENT_SECRET=your-client-secret \
-e SESSION_SECRET=your-session-secret \
kevinho/clawfeed
# 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:8767
Create 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:
https://yourdomain.com/api/auth/callback.envAll 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
}
templates/curation-rules.md to control content filteringtemplates/digest-prompt.md to 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-reload
cd test
./setup.sh # Create test users
./e2e.sh # Run 66 E2E tests
./teardown.sh # Clean up
See docs/ARCHITECTURE.md for multi-tenant design and scale analysis.
See ROADMAP.md or the in-app roadmap page.
git checkout -b feature/amazing-feature)git commit -m 'Add some amazing feature')git push origin feature/amazing-feature)MIT License — see LICENSE for details.
Copyright 2026 Kevin He
46 followers · starred Feb 2026
133 followers · starred Feb 2026
122 followers · starred Feb 2026
39 followers · starred Apr 2026
ClawFeed — AI-powered news digest with structured summaries from Twitter/RSS feeds and web dashboard
See the codeStop 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.

clawhub install clawfeed
cd ~/.openclaw/skills/
git clone https://github.com/kevinho/clawfeed.git
OpenClaw 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.git
git clone https://github.com/kevinho/clawfeed.git
cd clawfeed
npm install
# Basic usage
docker run -d -p 8767:8767 kevinho/clawfeed
# With persistent data
docker run -d -p 8767:8767 -v clawfeed-data:/app/data kevinho/clawfeed
# With environment variables (recommended for production)
docker run -d -p 8767:8767 \
-v clawfeed-data:/app/data \
-e ALLOWED_ORIGINS=https://yourdomain.com \
-e API_KEY=your-api-key \
-e GOOGLE_CLIENT_ID=your-client-id \
-e GOOGLE_CLIENT_SECRET=your-client-secret \
-e SESSION_SECRET=your-session-secret \
kevinho/clawfeed
# 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:8767
Create 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:
https://yourdomain.com/api/auth/callback.envAll 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
}
templates/curation-rules.md to control content filteringtemplates/digest-prompt.md to 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-reload
cd test
./setup.sh # Create test users
./e2e.sh # Run 66 E2E tests
./teardown.sh # Clean up
See docs/ARCHITECTURE.md for multi-tenant design and scale analysis.
See ROADMAP.md or the in-app roadmap page.
git checkout -b feature/amazing-feature)git commit -m 'Add some amazing feature')git push origin feature/amazing-feature)MIT License — see LICENSE for details.
Copyright 2026 Kevin He
46 followers · starred Feb 2026
133 followers · starred Feb 2026
122 followers · starred Feb 2026
39 followers · starred Apr 2026