kevinho/clawfeed

ClawFeed — AI-powered news digest with structured summaries from Twitter/RSS feeds and web dashboard

HTML

2,399

87 commits

updated May 9, 2026

See the code

README

ClawFeed

Stop scrolling. Start knowing.

ClawHub GitHub License: MIT

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.

Dashboard

Features

  • 📰 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

Installation

clawhub install clawfeed

Option 2: OpenClaw Skill

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.

Option 3: Zylos Skill

cd ~/.zylos/skills/
git clone https://github.com/kevinho/clawfeed.git

Option 4: Standalone

git clone https://github.com/kevinho/clawfeed.git
cd clawfeed
npm install

Option 5: Docker

# 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

Quick Start

# 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

Environment Variables

Create a .env file in the project root:

VariableDescriptionRequiredDefault
GOOGLE_CLIENT_IDGoogle OAuth client IDNo*-
GOOGLE_CLIENT_SECRETGoogle OAuth client secretNo*-
SESSION_SECRETSession encryption keyNo*-
API_KEYAPI key for digest creationNo-
DIGEST_PORTServer portNo8767
ALLOWED_ORIGINSAllowed origins for CORSNolocalhost

*Required for authentication features. Without OAuth, the app runs in read-only mode.

Authentication Setup

To enable Google OAuth login:

  1. Go to Google Cloud Console
  2. Create a new project or select existing one
  3. Enable the Google+ API
  4. Create OAuth 2.0 credentials
  5. Add your domain to authorized origins
  6. Add callback URL: https://yourdomain.com/api/auth/callback
  7. Set credentials in .env

API

All endpoints prefixed with /api/.

Digests

MethodEndpointDescriptionAuth
GET/api/digestsList digests ?type=4h&limit=20&offset=0-
GET/api/digests/:idGet single digest-
POST/api/digestsCreate digestAPI Key

Auth

MethodEndpointDescriptionAuth
GET/api/auth/configAuth availability check-
GET/api/auth/googleStart OAuth flow-
GET/api/auth/callbackOAuth callback-
GET/api/auth/meCurrent user infoYes
POST/api/auth/logoutLogoutYes

Marks (Bookmarks)

MethodEndpointDescriptionAuth
GET/api/marksList bookmarksYes
POST/api/marksAdd bookmark { url, title?, note? }Yes
DELETE/api/marks/:idRemove bookmarkYes

Sources

MethodEndpointDescriptionAuth
GET/api/sourcesList user's sourcesYes
POST/api/sourcesCreate source { name, type, config }Yes
PUT/api/sources/:idUpdate sourceYes
DELETE/api/sources/:idSoft-delete sourceYes
GET/api/sources/detectAuto-detect source type from URLYes

Source Packs

MethodEndpointDescriptionAuth
GET/api/packsBrowse public packs-
POST/api/packsCreate pack from your sourcesYes
POST/api/packs/:id/installInstall pack (subscribe to its sources)Yes

Feeds

MethodEndpointDescriptionAuth
GET/feed/:slugUser's digest feed (HTML)-
GET/feed/:slug.jsonJSON Feed format-
GET/feed/:slug.rssRSS format-

Config

MethodEndpointDescriptionAuth
GET/api/changelogChangelog ?lang=zh|en-
GET/api/roadmapRoadmap ?lang=zh|en-

Reverse Proxy

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
}

Customization

  • Curation rules: Edit templates/curation-rules.md to control content filtering
  • Digest format: Edit templates/digest-prompt.md to customize AI output format

Source Types

TypeExampleDescription
twitter_feed@karpathyTwitter/X user feed
twitter_listList URLTwitter list
rssAny RSS/Atom URLRSS feed
hackernewsHN Front PageHacker News
reddit/r/MachineLearningSubreddit
github_trendinglanguage=pythonGitHub trending repos
websiteAny URLWebsite scraping
digest_feedClawFeed user slugAnother user's digest
custom_apiJSON endpointCustom API

Development

npm run dev  # Start with --watch for auto-reload

Testing

cd test
./setup.sh    # Create test users
./e2e.sh      # Run 66 E2E tests
./teardown.sh # Clean up

Architecture

See docs/ARCHITECTURE.md for multi-tenant design and scale analysis.

Roadmap

See ROADMAP.md or the in-app roadmap page.

Contributing

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

MIT License — see LICENSE for details.

Copyright 2026 Kevin He

kevinho/clawfeed

ClawFeed — AI-powered news digest with structured summaries from Twitter/RSS feeds and web dashboard

HTML

2,399

87 commits

updated May 9, 2026

See the code

README

ClawFeed

Stop scrolling. Start knowing.

ClawHub GitHub License: MIT

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.

Dashboard

Features

  • 📰 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

Installation

clawhub install clawfeed

Option 2: OpenClaw Skill

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.

Option 3: Zylos Skill

cd ~/.zylos/skills/
git clone https://github.com/kevinho/clawfeed.git

Option 4: Standalone

git clone https://github.com/kevinho/clawfeed.git
cd clawfeed
npm install

Option 5: Docker

# 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

Quick Start

# 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

Environment Variables

Create a .env file in the project root:

VariableDescriptionRequiredDefault
GOOGLE_CLIENT_IDGoogle OAuth client IDNo*-
GOOGLE_CLIENT_SECRETGoogle OAuth client secretNo*-
SESSION_SECRETSession encryption keyNo*-
API_KEYAPI key for digest creationNo-
DIGEST_PORTServer portNo8767
ALLOWED_ORIGINSAllowed origins for CORSNolocalhost

*Required for authentication features. Without OAuth, the app runs in read-only mode.

Authentication Setup

To enable Google OAuth login:

  1. Go to Google Cloud Console
  2. Create a new project or select existing one
  3. Enable the Google+ API
  4. Create OAuth 2.0 credentials
  5. Add your domain to authorized origins
  6. Add callback URL: https://yourdomain.com/api/auth/callback
  7. Set credentials in .env

API

All endpoints prefixed with /api/.

Digests

MethodEndpointDescriptionAuth
GET/api/digestsList digests ?type=4h&limit=20&offset=0-
GET/api/digests/:idGet single digest-
POST/api/digestsCreate digestAPI Key

Auth

MethodEndpointDescriptionAuth
GET/api/auth/configAuth availability check-
GET/api/auth/googleStart OAuth flow-
GET/api/auth/callbackOAuth callback-
GET/api/auth/meCurrent user infoYes
POST/api/auth/logoutLogoutYes

Marks (Bookmarks)

MethodEndpointDescriptionAuth
GET/api/marksList bookmarksYes
POST/api/marksAdd bookmark { url, title?, note? }Yes
DELETE/api/marks/:idRemove bookmarkYes

Sources

MethodEndpointDescriptionAuth
GET/api/sourcesList user's sourcesYes
POST/api/sourcesCreate source { name, type, config }Yes
PUT/api/sources/:idUpdate sourceYes
DELETE/api/sources/:idSoft-delete sourceYes
GET/api/sources/detectAuto-detect source type from URLYes

Source Packs

MethodEndpointDescriptionAuth
GET/api/packsBrowse public packs-
POST/api/packsCreate pack from your sourcesYes
POST/api/packs/:id/installInstall pack (subscribe to its sources)Yes

Feeds

MethodEndpointDescriptionAuth
GET/feed/:slugUser's digest feed (HTML)-
GET/feed/:slug.jsonJSON Feed format-
GET/feed/:slug.rssRSS format-

Config

MethodEndpointDescriptionAuth
GET/api/changelogChangelog ?lang=zh|en-
GET/api/roadmapRoadmap ?lang=zh|en-

Reverse Proxy

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
}

Customization

  • Curation rules: Edit templates/curation-rules.md to control content filtering
  • Digest format: Edit templates/digest-prompt.md to customize AI output format

Source Types

TypeExampleDescription
twitter_feed@karpathyTwitter/X user feed
twitter_listList URLTwitter list
rssAny RSS/Atom URLRSS feed
hackernewsHN Front PageHacker News
reddit/r/MachineLearningSubreddit
github_trendinglanguage=pythonGitHub trending repos
websiteAny URLWebsite scraping
digest_feedClawFeed user slugAnother user's digest
custom_apiJSON endpointCustom API

Development

npm run dev  # Start with --watch for auto-reload

Testing

cd test
./setup.sh    # Create test users
./e2e.sh      # Run 66 E2E tests
./teardown.sh # Clean up

Architecture

See docs/ARCHITECTURE.md for multi-tenant design and scale analysis.

Roadmap

See ROADMAP.md or the in-app roadmap page.

Contributing

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

MIT License — see LICENSE for details.

Copyright 2026 Kevin He

Significant stargazers

Xi Zhang

46 followers · starred Feb 2026

Kaiyan Zhang

133 followers · starred Feb 2026

Matt Cowger

122 followers · starred Feb 2026

Rohan Talip

39 followers · starred Apr 2026