[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-75059":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":26,"readmeContent":27,"aiSummary":28,"trendingCount":16,"starSnapshotCount":16,"syncStatus":29,"lastSyncTime":30,"discoverSource":31},75059,"clawfeed","kevinho\u002Fclawfeed","kevinho","ClawFeed — AI-powered news digest with structured summaries from Twitter\u002FRSS feeds and web dashboard","https:\u002F\u002Fclawfeed.kevinhe.io",null,"HTML",2247,188,12,20,0,5,22,15,73.53,"MIT License",false,"main",true,[],"2026-06-12 04:01:17","# ClawFeed\n\n> **Stop scrolling. Start knowing.**\n\n[![ClawHub](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FClawHub-clawfeed-blue)](https:\u002F\u002Fclawhub.ai\u002Fskills\u002Fclawfeed)\n[![GitHub](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Ftag\u002Fkevinho\u002Fclawfeed?label=version)](https:\u002F\u002Fgithub.com\u002Fkevinho\u002Fclawfeed)\n[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-yellow.svg)](LICENSE)\n\n[Live Demo: https:\u002F\u002Fclawfeed.kevinhe.io](https:\u002F\u002Fclawfeed.kevinhe.io)\n\nAI-powered news digest that curates thousands of sources down to the highlights that matter. Generates structured summaries (4H\u002Fdaily\u002Fweekly\u002Fmonthly) from Twitter, RSS, and more. Works standalone or as an [OpenClaw](https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw) \u002F [Zylos](https:\u002F\u002Fgithub.com\u002Fzylos-ai) skill.\n\n![Dashboard](docs\u002Fdemo.gif)\n\n## Features\n\n- 📰 **Multi-frequency digests** — 4-hourly, daily, weekly, monthly summaries\n- 📡 **Sources system** — Add Twitter feeds, RSS, HackerNews, Reddit, GitHub Trending, and more\n- 📦 **Source Packs** — Share curated source bundles with the community\n- 📌 **Mark & Deep Dive** — Bookmark content for AI-powered deep analysis\n- 🎯 **Smart curation** — Configurable rules for content filtering and noise reduction\n- 👀 **Follow\u002FUnfollow suggestions** — Based on feed quality analysis\n- 📢 **Feed output** — Subscribe to any user's digest via RSS or JSON Feed\n- 🌐 **Multi-language** — English and Chinese UI\n- 🌙 **Dark\u002FLight mode** — Theme toggle with localStorage persistence\n- 🖥️ **Web dashboard** — SPA for browsing and managing digests\n- 💾 **SQLite storage** — Fast, portable, zero-config database\n- 🔐 **Google OAuth** — Multi-user support with personal bookmarks and sources\n\n## Installation\n\n### Option 1: ClawHub (recommended)\n\n```bash\nclawhub install clawfeed\n```\n\n### Option 2: OpenClaw Skill\n\n```bash\ncd ~\u002F.openclaw\u002Fskills\u002F\ngit clone https:\u002F\u002Fgithub.com\u002Fkevinho\u002Fclawfeed.git\n```\n\nOpenClaw auto-detects `SKILL.md` and loads the skill. The agent can then generate digests via cron, serve the dashboard, and handle bookmark commands.\n\n### Option 3: Zylos Skill\n\n```bash\ncd ~\u002F.zylos\u002Fskills\u002F\ngit clone https:\u002F\u002Fgithub.com\u002Fkevinho\u002Fclawfeed.git\n```\n\n### Option 4: Standalone\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fkevinho\u002Fclawfeed.git\ncd clawfeed\nnpm install\n```\n\n### Option 5: Docker\n```bash\n# Basic usage\ndocker run -d -p 8767:8767 kevinho\u002Fclawfeed\n\n# With persistent data\ndocker run -d -p 8767:8767 -v clawfeed-data:\u002Fapp\u002Fdata kevinho\u002Fclawfeed\n\n# With environment variables (recommended for production)\ndocker run -d -p 8767:8767 \\\n  -v clawfeed-data:\u002Fapp\u002Fdata \\\n  -e ALLOWED_ORIGINS=https:\u002F\u002Fyourdomain.com \\\n  -e API_KEY=your-api-key \\\n  -e GOOGLE_CLIENT_ID=your-client-id \\\n  -e GOOGLE_CLIENT_SECRET=your-client-secret \\\n  -e SESSION_SECRET=your-session-secret \\\n  kevinho\u002Fclawfeed\n```\n\n## Quick Start\n\n```bash\n# 1. Copy and edit environment config\ncp .env.example .env\n# Edit .env with your settings\n\n# 2. Start the API server\nnpm start\n# → API running on http:\u002F\u002F127.0.0.1:8767\n```\n\n## Environment Variables\n\nCreate a `.env` file in the project root:\n\n| Variable | Description | Required | Default |\n|----------|-------------|----------|---------|\n| `GOOGLE_CLIENT_ID` | Google OAuth client ID | No* | - |\n| `GOOGLE_CLIENT_SECRET` | Google OAuth client secret | No* | - |\n| `SESSION_SECRET` | Session encryption key | No* | - |\n| `API_KEY` | API key for digest creation | No | - |\n| `DIGEST_PORT` | Server port | No | 8767 |\n| `ALLOWED_ORIGINS` | Allowed origins for CORS | No | localhost |\n\n\\*Required for authentication features. Without OAuth, the app runs in read-only mode.\n\n## Authentication Setup\n\nTo enable Google OAuth login:\n\n1. Go to [Google Cloud Console](https:\u002F\u002Fconsole.cloud.google.com\u002F)\n2. Create a new project or select existing one\n3. Enable the Google+ API\n4. Create OAuth 2.0 credentials\n5. Add your domain to authorized origins\n6. Add callback URL: `https:\u002F\u002Fyourdomain.com\u002Fapi\u002Fauth\u002Fcallback`\n7. Set credentials in `.env`\n\n## API\n\nAll endpoints prefixed with `\u002Fapi\u002F`.\n\n### Digests\n\n| Method | Endpoint | Description | Auth |\n|--------|----------|-------------|------|\n| `GET` | `\u002Fapi\u002Fdigests` | List digests `?type=4h&limit=20&offset=0` | - |\n| `GET` | `\u002Fapi\u002Fdigests\u002F:id` | Get single digest | - |\n| `POST` | `\u002Fapi\u002Fdigests` | Create digest | API Key |\n\n### Auth\n\n| Method | Endpoint | Description | Auth |\n|--------|----------|-------------|------|\n| `GET` | `\u002Fapi\u002Fauth\u002Fconfig` | Auth availability check | - |\n| `GET` | `\u002Fapi\u002Fauth\u002Fgoogle` | Start OAuth flow | - |\n| `GET` | `\u002Fapi\u002Fauth\u002Fcallback` | OAuth callback | - |\n| `GET` | `\u002Fapi\u002Fauth\u002Fme` | Current user info | Yes |\n| `POST` | `\u002Fapi\u002Fauth\u002Flogout` | Logout | Yes |\n\n### Marks (Bookmarks)\n\n| Method | Endpoint | Description | Auth |\n|--------|----------|-------------|------|\n| `GET` | `\u002Fapi\u002Fmarks` | List bookmarks | Yes |\n| `POST` | `\u002Fapi\u002Fmarks` | Add bookmark `{ url, title?, note? }` | Yes |\n| `DELETE` | `\u002Fapi\u002Fmarks\u002F:id` | Remove bookmark | Yes |\n\n### Sources\n\n| Method | Endpoint | Description | Auth |\n|--------|----------|-------------|------|\n| `GET` | `\u002Fapi\u002Fsources` | List user's sources | Yes |\n| `POST` | `\u002Fapi\u002Fsources` | Create source `{ name, type, config }` | Yes |\n| `PUT` | `\u002Fapi\u002Fsources\u002F:id` | Update source | Yes |\n| `DELETE` | `\u002Fapi\u002Fsources\u002F:id` | Soft-delete source | Yes |\n| `GET` | `\u002Fapi\u002Fsources\u002Fdetect` | Auto-detect source type from URL | Yes |\n\n### Source Packs\n\n| Method | Endpoint | Description | Auth |\n|--------|----------|-------------|------|\n| `GET` | `\u002Fapi\u002Fpacks` | Browse public packs | - |\n| `POST` | `\u002Fapi\u002Fpacks` | Create pack from your sources | Yes |\n| `POST` | `\u002Fapi\u002Fpacks\u002F:id\u002Finstall` | Install pack (subscribe to its sources) | Yes |\n\n### Feeds\n\n| Method | Endpoint | Description | Auth |\n|--------|----------|-------------|------|\n| `GET` | `\u002Ffeed\u002F:slug` | User's digest feed (HTML) | - |\n| `GET` | `\u002Ffeed\u002F:slug.json` | JSON Feed format | - |\n| `GET` | `\u002Ffeed\u002F:slug.rss` | RSS format | - |\n\n### Config\n\n| Method | Endpoint | Description | Auth |\n|--------|----------|-------------|------|\n| `GET` | `\u002Fapi\u002Fchangelog` | Changelog `?lang=zh\\|en` | - |\n| `GET` | `\u002Fapi\u002Froadmap` | Roadmap `?lang=zh\\|en` | - |\n\n## Reverse Proxy\n\nExample Caddy configuration:\n\n```caddyfile\nhandle \u002Fdigest\u002Fapi\u002F* {\n    uri strip_prefix \u002Fdigest\u002Fapi\n    reverse_proxy localhost:8767\n}\nhandle_path \u002Fdigest\u002F* {\n    root * \u002Fpath\u002Fto\u002Fclawfeed\u002Fweb\n    file_server\n}\n```\n\n## Customization\n\n- **Curation rules**: Edit `templates\u002Fcuration-rules.md` to control content filtering\n- **Digest format**: Edit `templates\u002Fdigest-prompt.md` to customize AI output format\n\n## Source Types\n\n| Type | Example | Description |\n|------|---------|-------------|\n| `twitter_feed` | `@karpathy` | Twitter\u002FX user feed |\n| `twitter_list` | List URL | Twitter list |\n| `rss` | Any RSS\u002FAtom URL | RSS feed |\n| `hackernews` | HN Front Page | Hacker News |\n| `reddit` | `\u002Fr\u002FMachineLearning` | Subreddit |\n| `github_trending` | `language=python` | GitHub trending repos |\n| `website` | Any URL | Website scraping |\n| `digest_feed` | ClawFeed user slug | Another user's digest |\n| `custom_api` | JSON endpoint | Custom API |\n\n## Development\n\n```bash\nnpm run dev  # Start with --watch for auto-reload\n```\n\n### Testing\n\n```bash\ncd test\n.\u002Fsetup.sh    # Create test users\n.\u002Fe2e.sh      # Run 66 E2E tests\n.\u002Fteardown.sh # Clean up\n```\n\n## Architecture\n\nSee [docs\u002FARCHITECTURE.md](docs\u002FARCHITECTURE.md) for multi-tenant design and scale analysis.\n\n## Roadmap\n\nSee [ROADMAP.md](ROADMAP.md) or the in-app roadmap page.\n\n## Contributing\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feature\u002Famazing-feature`)\n3. Commit your changes (`git commit -m 'Add some amazing feature'`)\n4. Push to the branch (`git push origin feature\u002Famazing-feature`)\n5. Open a Pull Request\n\n## License\n\nMIT License — see [LICENSE](LICENSE) for details.\n\nCopyright 2026 Kevin He\n","ClawFeed 是一个由 AI 驱动的新闻摘要工具，能够从 Twitter 和 RSS 源中提取关键信息并生成结构化的总结。其核心功能包括多频次摘要（如每4小时、每日、每周和每月）、来源管理系统（支持添加 Twitter、RSS、HackerNews 等多种数据源），以及智能策展规则设置以过滤无关内容。此外，它还提供了深挖标记功能、基于质量分析的订阅建议，并支持通过 RSS 或 JSON Feed 订阅其他用户的摘要。ClawFeed 适合需要高效获取定制化新闻资讯的个人或团队使用，在快节奏的工作环境中尤为实用。项目采用 HTML 构建前端界面，支持多语言显示与主题切换，提供 SQLite 存储方案确保数据便携性与安全性，同时兼容 Google OAuth 实现多用户管理。",2,"2026-06-11 03:52:07","high_star"]