{"id":51192724,"url":"https://github.com/feoh/daily-firehose","last_synced_at":"2026-06-27T17:01:50.632Z","repository":{"id":361484810,"uuid":"1254587329","full_name":"feoh/daily-firehose","owner":"feoh","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-23T21:40:29.000Z","size":349,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-23T23:05:13.455Z","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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-30T18:56:00.000Z","updated_at":"2026-06-23T21:40:33.000Z","dependencies_parsed_at":null,"dependency_job_id":"5bb97d59-46c0-4739-892e-e0b8b8bb1fbf","html_url":"https://github.com/feoh/daily-firehose","commit_stats":null,"previous_names":["feoh/daily-firehose"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/feoh/daily-firehose","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/feoh%2Fdaily-firehose","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/feoh%2Fdaily-firehose/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/feoh%2Fdaily-firehose/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/feoh%2Fdaily-firehose/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/feoh","download_url":"https://codeload.github.com/feoh/daily-firehose/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/feoh%2Fdaily-firehose/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:49.256Z","updated_at":"2026-06-27T17:01:50.625Z","avatar_url":"https://github.com/feoh.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Daily Firehose\n\nDaily Firehose is a personal, accessible Django RSS reader for daily information flow.\n\n## Screenshot\n\n![Daily Firehose article reading view showing today’s articles and read/save controls](docs/images/article-reading-view.png)\n\n## Goals\n\n- Show Today’s Firehose, plus week/month/feed views.\n- Keep readability and WCAG AA accessibility central.\n- Support Django auth, spacious article cards, keyboard-friendly controls, and high-contrast themes.\n- Import and export feed subscriptions as OPML.\n- Save articles to Linkding and track local saved-article metadata for future recommendations.\n- Expose agent-friendly digest JSON.\n\n## Local setup with uv\n\n```bash\ncd ~/src/personal/daily-firehose\nuv sync\nuv run python manage.py migrate\nuv run python manage.py createsuperuser\nuv run python manage.py runserver\n```\n\nOpen \u003chttp://127.0.0.1:8000/\u003e and sign in.\n\n## Docker Compose setup\n\nThe compose stack includes the Django web app, PostgreSQL, and a simple feed-refresh loop.\n\n```bash\ncp .env.example .env\n# Edit .env, especially DJANGO_SECRET_KEY and LINKDING_TOKEN.\ndocker compose up --build\n```\n\nCreate a superuser in the running web container:\n\n```bash\ndocker compose exec web python manage.py createsuperuser\n```\n\nOpen \u003chttp://127.0.0.1:8000/\u003e and sign in.\n\n## Configuration\n\nEnvironment variables:\n\n- `DJANGO_SECRET_KEY` — production secret key.\n- `DJANGO_DEBUG` — defaults to `true` for local development.\n- `DJANGO_ALLOWED_HOSTS` — comma-separated host list, defaults to `localhost,127.0.0.1,daily-firehose.reedfish-regulus.ts.net`.\n- `DJANGO_CSRF_TRUSTED_ORIGINS` — comma-separated trusted origins for proxied HTTPS, defaults to `https://daily-firehose.reedfish-regulus.ts.net`.\n- `DATABASE_URL` — optional database URL. Defaults to local SQLite for uv development; compose sets this to PostgreSQL.\n- `LINKDING_URL` — defaults to `https://linkding.reedfish-regulus.ts.net`.\n- `LINKDING_TOKEN` — API token used by **Save to Linkding**.\n\n## Feeds and OPML\n\nFeeds can be added from the **Feeds** page or from Django admin.\n\nOPML support:\n\n- Import: `/opml/import/`\n- Export: `/opml/export/`\n\n## Refreshing feeds\n\nRun the management command manually or from cron/systemd:\n\n```bash\nuv run python manage.py refresh_feeds\n```\n\n## Saved articles\n\nWhen an article is saved, Daily Firehose records the article URL, title, feed, category, timestamp, and Linkding status locally. This preserves a history that can later be used to highlight articles likely to be interesting.\n\n## Agent-friendly API\n\nCreate a bearer token for an agent or other program:\n\n```bash\nuv run python manage.py create_api_token \u003cusername\u003e --name morning-agent\n```\n\nUse it with `Authorization: Bearer \u003ctoken\u003e` against `/api/v1/` endpoints. Common morning workflow:\n\n- `GET /api/v1/briefing/morning/` — today’s unread, unsaved articles plus action URLs.\n- `GET /api/v1/articles/?period=today|week|month` — article lists; optional `include_read=true`, `include_saved=true`, `feed_id=...`, or `start=YYYY-MM-DD\u0026end=YYYY-MM-DD`.\n- `POST /api/v1/articles/\u003cid\u003e/read/` with `{\"is_read\": true}` — mark read or unread.\n- `POST /api/v1/articles/\u003cid\u003e/saved/` with `{\"is_saved\": true, \"notes\": \"...\"}` — save locally and to Linkding when configured. `DELETE` the same URL to unsave locally.\n- `POST /api/v1/mark-period-read/` with `{\"scope\": \"day\"}` — mark day/week/month read.\n- `GET/POST/PATCH /api/v1/feeds/…`, `GET/POST /api/v1/categories/`, `GET/PATCH /api/v1/preferences/`, and `POST /api/v1/refresh/` expose feed/category/preference/refresh controls.\n\nThe older session-authenticated today digest remains available at `/api/digest/today.json`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffeoh%2Fdaily-firehose","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffeoh%2Fdaily-firehose","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffeoh%2Fdaily-firehose/lists"}