{"id":37227087,"url":"https://github.com/taciturnaxolotl/herald","last_synced_at":"2026-01-18T06:46:45.637Z","repository":{"id":331571678,"uuid":"1131402598","full_name":"taciturnaxolotl/herald","owner":"taciturnaxolotl","description":"rss email digests over ssh because you're a cool kid","archived":false,"fork":false,"pushed_at":"2026-01-10T15:49:44.000Z","size":160,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-11T01:34:21.373Z","etag":null,"topics":["charm","go","rss","rss-reader","ssh"],"latest_commit_sha":null,"homepage":"https://herald.dunkirk.sh/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/taciturnaxolotl.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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},"funding":{"github":"kcoderhtml"}},"created_at":"2026-01-10T00:19:58.000Z","updated_at":"2026-01-10T19:54:51.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/taciturnaxolotl/herald","commit_stats":null,"previous_names":["taciturnaxolotl/herald"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/taciturnaxolotl/herald","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taciturnaxolotl%2Fherald","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taciturnaxolotl%2Fherald/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taciturnaxolotl%2Fherald/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taciturnaxolotl%2Fherald/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/taciturnaxolotl","download_url":"https://codeload.github.com/taciturnaxolotl/herald/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/taciturnaxolotl%2Fherald/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28442262,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-15T00:55:22.719Z","status":"online","status_checked_at":"2026-01-15T02:00:08.019Z","response_time":62,"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":["charm","go","rss","rss-reader","ssh"],"created_at":"2026-01-15T03:18:41.564Z","updated_at":"2026-01-15T03:18:42.176Z","avatar_url":"https://github.com/taciturnaxolotl.png","language":"Go","funding_links":["https://github.com/sponsors/kcoderhtml"],"categories":[],"sub_categories":[],"readme":"# Herald 🎏\n\n![herald web interface](https://l4.dunkirk.sh/i/TuJ7meLh1JB9.webp)\n\nThis was inspired by the sunsetting of [pico.sh/feeds](https://blog.pico.sh/ann-033-moving-rss-to-email-pico-plus) being available outside of `pico+`. It is a totally understandable move from them as their email costs were skyrocketing and they needed to pay for it somehow. This was created to allow me to still get my rss feeds delivered to me each day by email which I have grown quite accustomed to. The config is completely compatible with the `pico.sh` format as of `2026-01-09` and should stay fairly stable. It is also configured over ssh with the slight addition that you can view your feeds on a website as well as I found myself wanting to hot load my feeds into my website :)\n\nThe canonical repo for this is hosted on tangled over at [`dunkirk.sh/herald`](https://tangled.org/@dunkirk.sh/herald)\n\n## Quick Start\n\n```bash\n# Build\ngo build -ldflags \"-X main.commitHash=$(git log -1 --format=%H)\" -o herald .\n\n# Run the server\n./herald serve\n\n# Or with a config file\n./herald serve -c config.yaml\n```\n\n\u003e **Note:** The commit hash is automatically detected at runtime if not embedded at build time.\n\n## Usage\n\n### Upload a config\n\nCreate a `feeds.txt` file:\n\n```text\n=: email you@example.com\n=: cron 0 8 * * *\n=: digest true\n=\u003e https://dunkirk.sh/atom.xml\n=\u003e https://news.ycombinator.com/rss\n=\u003e https://lobste.rs/rss \"Lobsters\"\n```\n\nUpload via SCP:\n\n```bash\nscp feeds.txt user@herald.dunkirk.sh:\n```\n\n### SSH Configuration\n\nAdd this to your `~/.ssh/config` for easier access:\n\n```ssh-config\nHost herald\n    HostName herald.dunkirk.sh\n    Port 2223\n    User herald\n```\n\nThen use: `scp feeds.txt herald:` and `ssh herald ls`\n\n### SSH Commands\n\n```bash\n# Get your fingerprint (for web dashboard)\nssh herald.dunkirk.sh\n\n# List your configs\nssh herald.dunkirk.sh ls\n\n# Show config contents\nssh herald.dunkirk.sh cat feeds.txt\n\n# Delete a config\nssh herald.dunkirk.sh rm feeds.txt\n\n# Activate/deactivate configs\nssh herald.dunkirk.sh activate feeds.txt\nssh herald.dunkirk.sh deactivate feeds.txt\n\n# Run immediately (don't wait for cron)\nssh herald.dunkirk.sh run feeds.txt\n\n# Show recent activity\nssh herald.dunkirk.sh logs\n```\n\n### Web Interface\n\nVisit `http://localhost:8080` for the landing page.\n\nAfter uploading a config, run `ssh herald.dunkirk.sh` to get your fingerprint, then visit:\n\n- `http://localhost:8080/{fingerprint}` - Your dashboard with config status\n- `http://localhost:8080/{fingerprint}/feeds.xml` - RSS feed for feeds.txt\n- `http://localhost:8080/{fingerprint}/feeds.json` - JSON feed for feeds.txt\n\n## Config Format\n\n### Directives\n\n| Directive           | Required | Description                                       |\n| ------------------- | -------- | ------------------------------------------------- |\n| `=: email \u003caddr\u003e`   | Yes      | Recipient email address                           |\n| `=: cron \u003cexpr\u003e`    | Yes      | Standard cron expression (5 fields)               |\n| `=: digest \u003cbool\u003e`  | No       | Combine all items into one email (default: true)  |\n| `=: inline \u003cbool\u003e`  | No       | Include article content in email (default: false) |\n| `=\u003e \u003curl\u003e [\"name\"]` | Yes (1+) | RSS/Atom feed URL, optional display name          |\n\n## Configuration\n\nCreate a `config.yaml`:\n\n```yaml\nhost: 0.0.0.0\nssh_port: 2222\nhttp_port: 8080\n\nhost_key_path: ./host_key\ndb_path: ./herald.db\n\nsmtp:\n  host: smtp.example.com\n  port: 587\n  user: sender@example.com\n  pass: ${SMTP_PASS}\n  from: herald@example.com\n\nallow_all_keys: true\n```\n\nEnvironment variables can also be used:\n\n- `HERALD_HOST`\n- `HERALD_SSH_PORT`\n- `HERALD_HTTP_PORT`\n- `HERALD_DB_PATH`\n- `HERALD_SMTP_HOST`\n- `HERALD_SMTP_PORT`\n- `HERALD_SMTP_USER`\n- `HERALD_SMTP_PASS`\n- `HERALD_SMTP_FROM`\n\n## Screenshots\n\nhere is an example of what an email digest looks like:\n\n![email from harold](https://l4.dunkirk.sh/i/Ck271POS5n0k.webp)\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"https://raw.githubusercontent.com/taciturnaxolotl/carriage/main/.github/images/line-break.svg\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ci\u003e\u003ccode\u003e\u0026copy 2025-present \u003ca href=\"https://dunkirk.sh\"\u003eKieran Klukas\u003c/a\u003e\u003c/code\u003e\u003c/i\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://tangled.org/dunkirk.sh/herald/blob/main/LICENSE.md\"\u003e\u003cimg src=\"https://img.shields.io/static/v1.svg?style=for-the-badge\u0026label=License\u0026message=O'Saasy\u0026logoColor=d9e0ee\u0026colorA=363a4f\u0026colorB=b7bdf8\"/\u003e\u003c/a\u003e\n    \u003ca href=\"https://codecov.io/gh/taciturnaxolotl/harold\"\u003e\u003cimg src=\"https://img.shields.io/codecov/c/github/taciturnaxolotl/harold?style=for-the-badge\u0026logoColor=d9e0ee\u0026colorA=363a4f\u0026colorB=a6da95\"/\u003e\u003c/a\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftaciturnaxolotl%2Fherald","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftaciturnaxolotl%2Fherald","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftaciturnaxolotl%2Fherald/lists"}