{"id":48218992,"url":"https://github.com/notoriouslab/issueops-digest","last_synced_at":"2026-04-04T19:03:30.357Z","repository":{"id":342526253,"uuid":"1174153645","full_name":"notoriouslab/issueops-digest","owner":"notoriouslab","description":"Turn a GitHub Issue into a search trigger — keywords in, AI-filtered digest out. No backend needed. Just fork and go. 用 GitHub Issue 當操作介面，填關鍵字即觸發 Actions 自動搜尋、AI 篩選並回傳摘要。免後台、Fork 即用，適合懶人情報收集。","archived":false,"fork":false,"pushed_at":"2026-04-02T05:36:43.000Z","size":977,"stargazers_count":30,"open_issues_count":0,"forks_count":10,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-02T18:56:18.277Z","etag":null,"topics":["digest","issueops","keywords"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/notoriouslab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-06T05:57:11.000Z","updated_at":"2026-04-02T05:36:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/notoriouslab/issueops-digest","commit_stats":null,"previous_names":["notoriouslab/issueops-digest"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/notoriouslab/issueops-digest","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/notoriouslab%2Fissueops-digest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/notoriouslab%2Fissueops-digest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/notoriouslab%2Fissueops-digest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/notoriouslab%2Fissueops-digest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/notoriouslab","download_url":"https://codeload.github.com/notoriouslab/issueops-digest/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/notoriouslab%2Fissueops-digest/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31409471,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["digest","issueops","keywords"],"created_at":"2026-04-04T19:03:30.253Z","updated_at":"2026-04-04T19:03:30.335Z","avatar_url":"https://github.com/notoriouslab.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# issueops-digest\n\nAI-powered news curation using GitHub Issues as your UI. No frontend, no server, no monthly fees.\n\n**Search → AI Score → Checkbox Pick → Auto-capture**\n\n## How it works\n\n1. **Search**: Brave + Tavily (optional) fetch news and web results for your keywords\n2. **Score**: Gemini AI filters out noise, scores articles by relevance and depth\n3. **Pick**: Results appear as a GitHub Issue with checkboxes — open the GitHub app on your phone, tick what you want\n4. **Capture**: Close the Issue → GitHub Actions auto-fetches full articles as Markdown\n\n### The full flow in action\n\n**Trigger a search via Telegram (optional) or CLI → get notified when results are ready → pick articles → auto-capture:**\n\n![Telegram Bot flow — search command, progress notification, and capture confirmation](sample/2026-03-06-02.png)\n\n**GitHub Issue with scored checkbox list — tick what you want, close to capture:**\n\n![GitHub Issue discovery panel with checkbox article list](sample/2026-03-06-01.png)\n\n**Captured article as clean Markdown:**\n\n![Captured Markdown article with metadata](sample/2026-03-06-03.png)\n\n## Quick Start\n\n### Option A: CLI Mode (run on your machine)\n\n```bash\ngit clone https://github.com/notoriouslab/issueops-digest.git\ncd issueops-digest\npip install -r requirements.txt\ncp .env.example .env\n# Fill in your API keys in .env\npython web_digest.py \"your search keywords\"\n```\n\n### Option B: Zero-Server Mode (GitHub Actions only)\n\n1. Fork this repo (keep it **private** — your Issues contain personal search data)\n2. Go to **Settings → Secrets and variables → Actions**\n3. Add these secrets: `BRAVE_API_KEY`, `GEMINI_API_KEY`, `GITHUB_TOKEN`\n4. Optional: `TAVILY_API_KEY`, `TELEGRAM_BOT_TOKEN`, `TELEGRAM_CHAT_ID`\n5. Edit `config.yaml` to set your topics\n6. The scheduled search runs daily, or trigger manually via **Actions → Scheduled Search → Run workflow**\n\n## API Keys\n\n| Service | Required | Free Tier | Get it |\n|---------|----------|-----------|--------|\n| **Brave Search** | Yes | ~1000 calls/mo ($5 credit, requires card) | [brave.com/search/api](https://brave.com/search/api/) |\n| **Gemini** | Yes | 1500 req/day | [aistudio.google.com/apikey](https://aistudio.google.com/apikey) |\n| **GitHub Token** | Yes | Free | [github.com/settings/tokens](https://github.com/settings/tokens) (needs `repo` scope) |\n| **Tavily** | No | 1000 calls/mo | [tavily.com](https://tavily.com/) |\n| **Jina Reader** | No | Free (rate-limited) | No signup needed |\n| **Telegram Bot** | No | Free | Talk to [@BotFather](https://t.me/BotFather) |\n\n## Telegram Notifications (optional)\n\nIf configured, you'll get a ping when:\n- **New Issues are ready** — \"go check and pick your articles\"\n- **Capture is complete** — \"your Markdown files are saved\"\n\nSetup: create a bot via [@BotFather](https://t.me/BotFather), get your Chat ID, add both as GitHub Secrets. That's it — no server, no polling, just two one-line `curl` calls in the Actions workflow.\n\nNot configured? Everything still works, you just won't get push notifications.\n\n## Configuration\n\nEdit `config.yaml`:\n\n```yaml\n# Topics for scheduled search\ntopics:\n  - \"AI agent framework\"\n  - \"台積電 供應鏈\"\n\n# Weight profile: default, news, research\nweight_profile: default\n\n# Your trusted sources (higher = more trusted, max 15)\nauthority_domains:\n  bloomberg.com: 15\n  reuters.com: 12\n```\n\n### Weight Profiles\n\n| Profile | Best for | Behavior |\n|---------|----------|----------|\n| `default` | General use | Balanced scoring |\n| `news` | Breaking news | Recency weighted higher |\n| `research` | Deep research | Evergreen content protected from time decay |\n\n```bash\npython web_digest.py \"quantum computing\" --profile=research\n```\n\n## Security\n\n\u003e ⚠️ **Use a private repo.** Your Issues contain search keywords, selected articles, and personal notes.\n\n- API keys: stored in `.env` (local) or GitHub Secrets (Actions) — never committed\n- `.env` is pre-configured in `.gitignore`\n- The app checks on startup that `.env` is gitignored and warns you if not\n\n## Quota Tracking\n\nIn CLI mode, the app tracks your API usage in `.usage_stats.json` (gitignored) and warns you:\n- **80%**: yellow warning\n- **95%**: red alert\n\nLimits are configurable in `config.yaml` under `quotas`.\n\n## How the scoring works\n\n1. **Brave Search** fetches news + web results; **Tavily** (optional) adds advanced search\n2. Results are merged via **round-robin interleaving** so no single source dominates\n3. **Jina Reader** fetches full text from quality platforms (Substack, Medium, etc.)\n4. **Gemini AI** scores each result for relevance (0-10), flags duplicates\n5. A **fuzzy keyword filter** (bilingual, order-independent) penalizes off-topic results\n6. **Authority bonus** from your configured trusted domains\n7. **Recency scoring** with evergreen protection in `research` mode\n\n## License\n\nMIT\n\n## Credits\n\nBuilt with the help of AI. Inspired by the belief that anyone with an idea can build useful tools — no CS degree required.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnotoriouslab%2Fissueops-digest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnotoriouslab%2Fissueops-digest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnotoriouslab%2Fissueops-digest/lists"}