← Commit history

Publish 1.4.0

Drew Owens ·59bd035486 ·2mo ago ·parent 8dcf03f
4 files changed +53−4
README.md+39−1
@@ -65,7 +65,7 @@ boot, then prefix the install command below with Run this on whichever container will host the service:  ```bash-curl -fsSL https://wiki.adom.inc/download/adom/adom-rss-gchat/1.3.0/install.sh | bash+curl -fsSL https://wiki.adom.inc/download/adom/adom-rss-gchat/1.4.0/install.sh | bash ```  No Rust, git, or other tooling needed: the installer downloads a prebuilt@@ -116,6 +116,7 @@ list before every save, and the service hot-reloads the file each poll cycle: | Route a feed to another space | Give it that space's webhook URL | | Status-page style re-posts | Set dedup to `guid+date` | | Cut a noisy feed down | Filters → only / skip categories |+| Post only parts of a newsletter | `digest_sections` (see below) | | Stop old articles arriving as news | Filters → max age | | Rename a feed's label | Edit label → Save (read-history is kept) | | Stop one feed | Remove it → Save |@@ -250,6 +251,43 @@ items are recorded as seen, so changing a filter later does not backfill. That example takes OpenAI's firehose from ~1100 items down to ~10 actual product announcements. +### Digest mode: post only the sections you want++Newsletters arrive as one item per issue, so a feed reader shows you a single+subject line for what is really a dozen stories mixed with sponsored blocks.+`digest_sections` lifts out named sections and posts nothing else.++```json+{ "url": "https://rss.beehiiv.com/feeds/<id>.xml", "label": "Daily AI",+  "digest_item_chars": 400,+  "digest_sections": [+    { "name": "LATEST DEVELOPMENTS", "require": "Why it matters",+      "summary_after": "The Rundown:" },+    { "name": "Trending AI Tools" },+    { "name": "Everything else in AI today" }+  ] }+```++| Key | Meaning |+|-----|---------|+| `name` | Section heading or coloured banner to match (case-insensitive substring) |+| `require` | Keep only sub-blocks containing this phrase |+| `summary_after` | Start each block's summary here; it ends with that paragraph |+| `digest_item_chars` | Cap per line (default 400) |+| `digest_max_chars` | Cap for the whole message (default 3500) |++`require` is the useful part. Publications label their own editorial content+("Why it matters", "The takeaway") and sponsored blocks never carry it, so one+phrase separates articles from ads without any per-advertiser list.++Sections are located by heading *or* by the full-width coloured banners that+newsletters use as dividers, which are plain `div`s that a heading scan misses.+If none of the named sections match, because the publisher restructured, the+message falls back to title and link rather than posting the whole issue.++For a simpler zero-config version, `expand_headlines: true` just lists the+issue's own contents list under the title.+ `feeds.json` format (what the editor writes):  ```json
SKILL.md+12−1
@@ -44,7 +44,7 @@ own small Adom container; no central service, no shared credentials. 2. **Install on the host container** (one-liner, no Rust/git needed):     ```bash-   curl -fsSL https://wiki.adom.inc/download/adom/adom-rss-gchat/1.3.0/install.sh | bash+   curl -fsSL https://wiki.adom.inc/download/adom/adom-rss-gchat/1.4.0/install.sh | bash    ```     The installer prints the exact next steps. It also authenticates its own@@ -99,6 +99,17 @@ service container over SSH, same format:   Research / Global Affairs), and max_age_days for sites that republish old   articles under fresh ids so they do not arrive as news. +### Newsletters (one item per issue)++`digest_sections` posts only named sections of an issue body and drops the+rest. Each rule takes `name` (heading or coloured banner text), optional+`require` (keep only sub-blocks containing this phrase, which is how sponsored+blocks get dropped since they never carry the publication's editorial label+like "Why it matters"), and optional `summary_after` (where a block's summary+starts; it ends with that paragraph). `expand_headlines: true` is the simpler+zero-config version that just lists the issue's contents. Both are per-feed and+degrade to title + link if the publisher restructures.+ ## Operations  - Logs: `~/rss-gchat/bridge.log`, `~/rss-gchat/editor.log` on the container.
package.json+1−1
@@ -2,7 +2,7 @@   "slug": "adom-rss-gchat",   "title": "RSS to Google Chat",   "type": "app",-  "version": "1.3.0",+  "version": "1.4.0",   "description": "Post new RSS feed items straight into your Google Chat spaces. A small always-on poller with a pinnable web editor: click the link in your space, add or edit feeds, Save \u2014 live within one poll cycle. Per-feed dedup handles both news feeds (post once) and status pages (re-post on updates).",   "tags": [     "rss",
page.json+1−1
@@ -2,7 +2,7 @@   "slug": "adom-rss-gchat",   "title": "RSS to Google Chat",   "type": "app",-  "version": "1.3.0",+  "version": "1.4.0",   "description": "Post new RSS feed items straight into your Google Chat spaces. A small always-on poller with a pinnable web editor: click the link in your space, add or edit feeds, Save — live within one poll cycle. Per-feed dedup handles both news feeds (post once) and status pages (re-post on updates).",   "tags": [     "rss",