{"id":51192726,"url":"https://github.com/feoh/morning-brief","last_synced_at":"2026-06-27T17:01:51.541Z","repository":{"id":361862940,"uuid":"1255622155","full_name":"feoh/morning-brief","owner":"feoh","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-01T15:55:33.000Z","size":57,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-01T16:25:46.021Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/feoh.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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-06-01T02:53:41.000Z","updated_at":"2026-06-01T16:12:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/feoh/morning-brief","commit_stats":null,"previous_names":["feoh/morning-brief"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/feoh/morning-brief","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/feoh%2Fmorning-brief","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/feoh%2Fmorning-brief/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/feoh%2Fmorning-brief/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/feoh%2Fmorning-brief/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/feoh","download_url":"https://codeload.github.com/feoh/morning-brief/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/feoh%2Fmorning-brief/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34860913,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-27T02:00:06.362Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2026-06-27T17:01:50.692Z","updated_at":"2026-06-27T17:01:51.536Z","avatar_url":"https://github.com/feoh.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Morning Brief\n\n![Morning Brief screenshot](docs/images/morning-brief.png)\n\nMorning Brief is a modular daily briefing tool. It currently builds a market update for AMZN, GOOG, AAPL, MSFT, Bitcoin, and Ethereum, includes top news headlines, today's new Daily Firehose RSS articles, and Todoist tasks due within the next week or overdue, then can post it to Discord.\n\n## Setup\n\n```bash\nuv sync\ncp .env.example .env\n```\n\nEdit `.env` and set `DISCORD_BOT_TOKEN` to the bot token formerly used for the OpenClaw-style Discord bot setup.\n\nThe default Discord channel is `#morning-brief`:\n\n```text\n1510832637407662142\n```\n\nOverride it with `DISCORD_CHANNEL_ID` only if the channel changes.\n\nFor RSS articles, set `DAILY_FIREHOSE_API_TOKEN` to a Daily Firehose bearer token and set the same `AGENT_LINK_SECRET` in both Morning Brief and Daily Firehose. Morning Brief fetches articles from `DAILY_FIREHOSE_API_URL` and creates signed public `save-and-go` links using `DAILY_FIREHOSE_PUBLIC_URL`. Clicking an RSS article link saves it through Daily Firehose, then redirects to the article.\n\nTop news headlines come from curated RSS sources with source-level leaning metadata. Icons are source labels, not per-article analysis:\n\n- 🔵 left-leaning source\n- 🔴 right-leaning source\n- ⚪ neutral / wire / international source\n\nSet `MORNING_BRIEF_NEWS_HEADLINE_LIMIT` to change the default top-news count from 5.\n\nFor Todoist tasks, set `TODOIST_API_TOKEN` (or `TODOIST_API_KEY`) to a Todoist API token. Morning Brief includes active tasks that are overdue or due within the next 7 days. Set `MORNING_BRIEF_TODOIST_TASK_LIMIT` to change the default task count from 20.\n\n## Usage\n\nPreview without posting:\n\n```bash\nuv run morning-brief preview\n```\n\nPost to Discord:\n\n```bash\nuv run morning-brief run\n```\n\n## Scheduling\n\nInstall and enable a systemd user timer for 6:00 AM Eastern:\n\n```bash\nuv run morning-brief install-schedule --time 06:00\n```\n\nUse another local time or timezone if needed:\n\n```bash\nuv run morning-brief install-schedule --time 07:30 --timezone America/New_York\n```\n\nCheck the timer:\n\n```bash\nsystemctl --user status morning-brief.timer\n```\n\nInspect run logs:\n\n```bash\njournalctl --user -u morning-brief.service\n```\n\nRemove the schedule:\n\n```bash\nuv run morning-brief uninstall-schedule\n```\n\n## Extending\n\nAdd new briefing sources by implementing `BriefingModule` from `morning_brief.modules.base` and returning a `BriefSection`. Enable modules in `morning_brief.briefing.default_modules()`.\n\nDelivery backends live under `morning_brief.delivery`.\n\n## Notes\n\n- Secrets belong in `.env`; do not commit them.\n- Market data comes from Yahoo Finance's chart API via `requests`.\n- Top news headlines come from curated RSS feeds across left-leaning, right-leaning, neutral, wire, and international sources.\n- RSS article data comes from the local Daily Firehose API.\n- Todoist task data comes from Todoist's REST API.\n- `docs/implementation-plan.md` contains the agreed initial implementation plan.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffeoh%2Fmorning-brief","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffeoh%2Fmorning-brief","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffeoh%2Fmorning-brief/lists"}