# ClawFeed: an AI digest server for Twitter, RSS and Hacker News

> ClawFeed turns many feeds into scheduled AI summaries and serves them from a small Node process with SQLite, an API key for writes and optional Google OAuth. It is a self-hosted tool, not a hosted reading app, and the last push to the repository was on 2026-05-09.

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

- Repository: https://github.com/kevinho/clawfeed
- Website: https://clawfeed.kevinhe.io
- Stars: 2,398 · Forks: 196
- Language: HTML
- License: MIT
- Published: 2026-09-28 · Updated: 2026-09-28 · Language: en
- Canonical page: https://hysenlabs.com/projects/kevinho-clawfeed

## What ClawFeed solves, and for whom

The README opens with a blunt promise: stop scrolling, start knowing. ClawFeed is aimed at people who follow too many sources and want the reading compressed instead of merely collected. It produces structured summaries at four cadences (4-hourly, daily, weekly, monthly) from Twitter, RSS, Hacker News, Reddit, GitHub Trending and plain websites, and it presents them in a web dashboard rather than a terminal.

The audience is narrower than the tagline suggests. ClawFeed is a server: a Node process that stores digests in SQLite and exposes them over HTTP. It is built to run standalone or as a skill inside OpenClaw or Zylos, which means the natural user is someone who already has an agent platform or a small always-on box. If you want an app you install and forget, the deployment steps below will feel like work. If you want your own digest endpoints that other tools can subscribe to, the shape is right.

## How the digest pipeline is put together

The repository layout is the clearest description of the architecture. src/ holds the server, migrations/ holds the SQLite schema, templates/ holds the prompt and curation files, and web/ is the single-page dashboard served as static files. package.json lists exactly one runtime dependency, better-sqlite3, and no AI SDK, which tells you where the model call happens: outside the Node process, driven by the agent that runs the skill.

That split matters. ClawFeed owns storage, scheduling surface, authentication and rendering. The summarisation is described in templates/digest-prompt.md, and content filtering is described in templates/curation-rules.md. Both are files you edit, so the quality of the output is a function of your prompt and your rules, not of a hidden pipeline. The trade-off is honest but real: there is no bundled model, no fallback provider and no built-in evaluation of whether a summary is any good.

Reads are open by design. GET /api/digests, GET /api/digests/:id, the auth config check and the public feed routes require no credentials, while writes to POST /api/digests require an API key. Per-user data (marks, sources, packs installation) sits behind Google OAuth. The README states that without OAuth the app runs in read-only mode, which is a reasonable default for a demo instance and a poor one for a private digest.

## Installing ClawFeed and creating your first digest

There are five documented installation paths. ClawHub is the recommended one, and the skill route clones the repository into an agent's skills directory. For a plain server, the standalone path is the shortest.

```bash
git clone https://github.com/kevinho/clawfeed.git
cd clawfeed
npm install
cp .env.example .env
npm start
```

After npm start the README says the API is running on http://127.0.0.1:8767. Open that address and you should get the dashboard from web/.

The environment file is where the deployment decisions live. The .env.example in the repository sets the port, the CORS origins and the optional credentials.

```bash
DIGEST_PORT=8767
ALLOWED_ORIGINS=localhost,127.0.0.1
API_KEY=
GOOGLE_CLIENT_ID=
GOOGLE_CLIENT_SECRET=
SESSION_SECRET=
```

Leaving API_KEY empty means the write endpoint is unprotected on whatever interface you expose; the Dockerfile binds DIGEST_HOST to 0.0.0.0, so a container published without a key is writable by anyone who can reach port 8767. Set API_KEY before you publish the port.

The Docker path is the one to use if you do not want Node on the host. The README gives a persistent-volume variant, and the image already sets DIGEST_PORT=8767 and a health check against the root path.

```bash
docker run -d -p 8767:8767 -v clawfeed-data:/app/data kevinho/clawfeed
```

Once the server is up, add a source through the API. POST /api/sources takes a name, a type and a config object, and GET /api/sources/detect will try to infer the type from a URL for you. The documented types include twitter_feed, twitter_list, rss, hackernews, reddit, github_trending, website and digest_feed. To publish your own digest outward, the feed routes are GET /feed/:slug for HTML, GET /feed/:slug.rss for RSS and GET /feed/:slug.json for JSON Feed.

## What ClawFeed does not do

The README is silent on several things a production operator would want. There is no documented rate limiting, no retention or pruning policy for the SQLite database, and no described rollback procedure for a bad digest. The test script is a single bash file, test/e2e.sh, invoked by npm test; there is no unit test layer to catch a regression in the prompt handling.

Source types are also less uniform than the table implies. Twitter feeds and lists depend on access that the README does not describe obtaining, and the website type is listed as scraping without any note on how it behaves when a page changes shape. If your sources are mostly Twitter, verify that path first, because it is the one with the most external dependencies and the least documentation.

The clearest wrong-tool case is a single user who wants a mobile reading app. ClawFeed is a multi-user server with OAuth, source packs and public feeds. Running it for one person means maintaining a database, a port and a proxy for a job that a feed reader already does.

## ClawFeed compared with a plain RSS reader

The obvious alternative is an RSS reader such as Miniflux or FreshRSS, and the difference is not cosmetic. A reader's job is to fetch and display items in the order they arrived. ClawFeed's job is to compress a window of time into a summary, which means it needs a model call and a prompt, and it can be wrong in a way a reader cannot: a summary can omit the item you cared about.

What you gain is cadence. Four-hourly, daily, weekly and monthly digests are first-class objects with their own endpoints, and the feed routes let other people subscribe to your output as RSS or JSON Feed. What you lose is fidelity and immediacy. There is no per-item read state in the documented API, and the only bookmarking primitive is the marks endpoints, which store a URL, an optional title and a note for later analysis rather than tracking what you have already seen.

If your problem is that you miss items, a reader is the better tool. If your problem is that you read too many items and remember none of them, the summarisation layer is the point.

## Maintenance, licensing and the upgrade path

ClawFeed is MIT licensed, which permits commercial use, modification and redistribution provided the copyright notice and permission notice are retained. The repository ships LICENSE at the top level. Nothing here is legal advice; if you redistribute the dashboard or the templates inside a product, read the licence text yourself.

The version numbers need attention. The latest tagged release listed for the repository is v0.2.0 from 2026-02-22, while package.json reads 0.8.1. Anyone pinning a Docker tag or a git ref should check which of those they are actually getting, because the release notes and the package manifest disagree. The last push was on 2026-05-09, so the code has been quiet for some months; treat it as a stable small service rather than a project with a fast-moving changelog. Upgrade cost is low in one direction: there is one runtime dependency, better-sqlite3, and the Dockerfile compiles it in a builder stage with python3, make and g++, so a Node version bump is the main thing that can break the image. Migrations live in migrations/, and the README does not describe how they are applied or reversed, so back up the data volume before pulling a newer image.

## Conclusion

Adopt ClawFeed if you already run a Node service or an agent platform such as OpenClaw or Zylos and want your own digest endpoints rather than another inbox. Skip it if you expect a hosted product with a managed summarisation backend, because the repository ships the server, the dashboard and the prompt templates, not the model. Before committing, verify three things on your own machine: that the summarisation step works with your provider, that GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET and SESSION_SECRET are set if you want anything beyond read-only mode, and that the /api/digests write path is protected by API_KEY.

## FAQ

### What are people using OpenClaw for, and does ClawFeed fit that use?

The README only says ClawFeed works standalone or as an OpenClaw skill, and that OpenClaw auto-detects SKILL.md so the agent can generate digests via cron, serve the dashboard and handle bookmark commands. The repository does not describe other OpenClaw uses.

### How does OpenClaw work with ClawFeed?

Cloning the repository into ~/.openclaw/skills/ is the documented skill install; OpenClaw auto-detects SKILL.md and loads the skill, after which the agent can generate digests via cron, serve the dashboard and handle bookmark commands. The README does not document OpenClaw's internals beyond that.

### Does ClawFeed need Google OAuth to run?

No. The README states that without OAuth the app runs in read-only mode, and .env.example marks GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET and SESSION_SECRET as optional. You need them for login, personal bookmarks and per-user sources.

### Which port does ClawFeed listen on?

The default is 8767, set by DIGEST_PORT in .env.example and by the Dockerfile, which also sets DIGEST_HOST to 0.0.0.0 and exposes 8767.

### How do I subscribe to a ClawFeed user's digest?

The feed routes are public: GET /feed/:slug returns HTML, /feed/:slug.rss returns RSS and /feed/:slug.json returns JSON Feed. The digest_feed source type also lets one ClawFeed user follow another user's digest.

### Is ClawFeed actively maintained?

The repository is not archived, but the last push was on 2026-05-09, so the code has not moved recently. The latest tagged release is v0.2.0 while package.json reports 0.8.1, so check which ref you are deploying.

## Sources

- [kevinho/clawfeed on GitHub](https://github.com/kevinho/clawfeed)
- [License: MIT](https://github.com/kevinho/clawfeed/blob/main/LICENSE)
- [Project website](https://clawfeed.kevinhe.io)
- [README](https://github.com/kevinho/clawfeed/blob/main/README.md)
- [Releases](https://github.com/kevinho/clawfeed/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/kevinho-clawfeed
