{"id":51124750,"url":"https://github.com/ezeoleaf/narrowcast","last_synced_at":"2026-06-25T06:30:26.973Z","repository":{"id":363418394,"uuid":"1258409032","full_name":"ezeoleaf/narrowcast","owner":"ezeoleaf","description":"Your own private news radio. A Go-powered pipeline that curates web feeds into a personalized voice broadcast for your morning routine.","archived":false,"fork":false,"pushed_at":"2026-06-08T19:59:56.000Z","size":46,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-08T21:24:58.716Z","etag":null,"topics":["automation","go","golang","raspberry-pi","rss-reader","text-to-speech"],"latest_commit_sha":null,"homepage":"","language":"Go","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/ezeoleaf.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":"ROADMAP.md","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-03T14:51:34.000Z","updated_at":"2026-06-08T20:00:00.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ezeoleaf/narrowcast","commit_stats":null,"previous_names":["ezeoleaf/narrowcast"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ezeoleaf/narrowcast","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ezeoleaf%2Fnarrowcast","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ezeoleaf%2Fnarrowcast/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ezeoleaf%2Fnarrowcast/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ezeoleaf%2Fnarrowcast/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ezeoleaf","download_url":"https://codeload.github.com/ezeoleaf/narrowcast/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ezeoleaf%2Fnarrowcast/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34763481,"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-25T02:00:05.521Z","response_time":101,"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":["automation","go","golang","raspberry-pi","rss-reader","text-to-speech"],"created_at":"2026-06-25T06:30:25.384Z","updated_at":"2026-06-25T06:30:26.968Z","avatar_url":"https://github.com/ezeoleaf.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# narrowcast\n\nA lightweight **Personal News Radio** — fetch RSS feeds, filter by your interests, and read headlines aloud (TTS). Runs on **macOS** (built-in `say`) and **Raspberry Pi** (Piper / espeak-ng).\n\n## Quick start\n\n```bash\ncp config.example.yaml config.yaml\nmake run\nmake test\n```\n\n```bash\ngo run . -once -dry-run\ngo run . -daemon\n```\n\n## Make targets\n\nRun `make help` for the full list. Common targets:\n\n| Target | Description |\n|--------|-------------|\n| `make build` | Build `bin/narrowcast` |\n| `make run` | Build and run one cycle |\n| `make test` | `go test -v ./...` |\n| `make lint` | `golangci-lint run` |\n| `make release` | Build `dist/*` binaries (for GitHub releases) |\n\nRelease binaries are published when you push a version tag (`v0.3.0`, etc.); see `.github/workflows/release.yml`.\n\n## CLI flags\n\n| Flag | Description |\n|------|-------------|\n| `-config` | Config path (default `config.yaml`) |\n| `-once` / `-daemon` | Run mode |\n| `-dry-run` | Log matches, no TTS |\n| `-tts` | Override: `mock`, `say`, `espeak`, `piper`, `elevenlabs`, `kokoro`, `auto` |\n| `-state-file` | Seen URLs (`none` disables) |\n| `-version` | Print version |\n\n## Config highlights\n\n| Field | Description |\n|-------|-------------|\n| `match_style` | `substring` or `word` (avoids `go` in `cargo`) |\n| `feeds` | URL strings or `{url, label}` |\n| `opml` | Merge feeds from OPML file |\n| `audio.engine` | `auto` tries `fallback` chain |\n| `audio.fallback` | Platform default if empty; e.g. `[say, piper, espeak, mock]` |\n| `audio.say` | macOS voice (`Samantha`) and speech rate |\n| `audio.elevenlabs` | Cloud TTS (`voice_id`, `ELEVENLABS_API_KEY` env) |\n| `audio.kokoro` | Local script path (stdin = text; for Pi) |\n\nTerms can use regex literals: `/\\braspberry\\s+pi/i`\n\n## ElevenLabs (cloud)\n\n```bash\nexport ELEVENLABS_API_KEY=your_key\n```\n\n```yaml\naudio:\n  engine: elevenlabs\n  elevenlabs:\n    voice_id: YOUR_VOICE_ID\n    model_id: eleven_turbo_v2_5\n    play_binary: afplay   # mpv on Linux\n```\n\n## Kokoro (local script on Pi)\n\nPoint `audio.kokoro.script` at a shell script that reads text from **stdin** and plays audio. See `deploy/kokoro-speak.sh.example`.\n\n```yaml\naudio:\n  engine: kokoro\n  kokoro:\n    script: /home/pi/bin/kokoro-speak.sh\n```\n\n## macOS\n\nNo extra TTS install needed — macOS includes `say`:\n\n```bash\n# List voices\nsay -v ?\n\n# config.yaml\naudio:\n  engine: say          # or auto with fallback: [say, mock]\n  say:\n    voice: Samantha\n    rate: 180\n\ngo run . -once -tts say\n```\n\nWith `engine: auto`, defaults are `say → elevenlabs → …` on macOS and `kokoro → piper → espeak → mock` on Linux (unconfigured engines are skipped).\n\n## Raspberry Pi install\n\n```bash\n# On your dev machine (or download narrowcast-linux-arm64 from GitHub Releases)\nmake release\nscp dist/narrowcast-linux-arm64 pi@raspberrypi.local:narrowcast/bin/narrowcast\n\n# On the Pi\nchmod +x ~/narrowcast/bin/narrowcast\nsudo cp deploy/narrowcast.service /etc/systemd/system/\n# Edit User, paths, and ExecStart in the unit file\nsudo systemctl enable --now narrowcast\n```\n\n## Homebrew\n\n```bash\nbrew tap ezeoleaf/tap\nbrew install narrowcast\n```\n\nAfter a new release, update `sha256` in `homebrew-tap/Formula/narrowcast.rb` (build with `make release` and `shasum -a 256 dist/narrowcast-darwin-amd64`).\n\nInstall TTS deps on the Pi:\n\n```bash\nsudo apt install espeak-ng alsa-utils\n# Optional: piper + voice model for audio.engine auto\n```\n\n## CI\n\nGitHub Actions (`.github/workflows/build.yml`) runs build, `golangci-lint`, and tests on push/PR to `main`. Tag pushes (`v*`) trigger release binaries via `release.yml`.\n\n## Roadmap\n\nSee [ROADMAP.md](ROADMAP.md).\n\n## License\n\nMIT (add LICENSE when publishing).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fezeoleaf%2Fnarrowcast","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fezeoleaf%2Fnarrowcast","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fezeoleaf%2Fnarrowcast/lists"}