A tiny Cloudflare Worker that adds a "Save to Matter" sharing service to Feedbin on the web/desktop.
Click "Save to Matter" on any article in Feedbin and it lands in your Matter reading queue.
Feedbin's custom Sharing Services can only open a GET URL with ${url}
and ${title} substituted in. Matter saves through an authenticated POST
(POST /public/v1/items with a Bearer token). There's no
getmatter.com/save?url= endpoint to point Feedbin at — and you wouldn't want
your Matter token sitting in a Feedbin config URL anyway.
This Worker is the bridge: it accepts the GET that Feedbin opens, checks a cheap shared key, and forwards an authenticated POST to Matter. Your Matter token stays server-side as a Worker secret and never touches the URL.
On iOS/iPadOS you don't need this. Matter's native share extension already shows up in the system share sheet. This is for Feedbin on the web/desktop, where there's no share sheet to hook into.
GET /save?key=<SHARED_KEY>&url=<article-url>
| Outcome | Response |
|---|---|
Missing/wrong key |
403 Forbidden |
Missing url |
400 |
| Save accepted | 200 — an HTML page that auto-closes its own tab (falls back to a "you can close this tab" note if the browser blocks self-close) |
Saved items go to the Matter queue (status: "queue").
Prerequisites: a Cloudflare account (free tier is fine), a Matter account with API access, and Node 18+.
-
Clone and install
git clone https://github.com/rianvdm/feedbin-matter.git cd feedbin-matter npm install -
Get a Matter API token. Generate one from Matter's API settings — see the Matter API quickstart. It looks like
mat_.... (If you use the Matter CLI, the token is also in~/.config/matter/config.json.) -
Create
.dev.varsin the repo root (it's gitignored):MATTER_TOKEN="mat_your_token_here" SHARED_KEY="paste-a-random-string-here"Generate a strong
SHARED_KEYwith:node -e "console.log(require('crypto').randomBytes(24).toString('base64url'))" -
Deploy. This uploads the secrets from
.dev.vars, then ships the Worker:npm run deploy
Wrangler prints your Worker URL, e.g.
https://feedbin-matter.<your-subdomain>.workers.dev. (You'll be prompted towrangler loginon first run if you haven't already.) -
Wire it into Feedbin. Feedbin → Settings → Sharing → add a custom sharing service:
- Name:
Save to Matter - URL:
https://feedbin-matter.<your-subdomain>.workers.dev/save?key=<SHARED_KEY>&url=${url}
Leave
${url}literal — Feedbin substitutes and URL-encodes it; the Worker decodes it, so query-heavy URLs survive. You don't need${title}; Matter extracts its own metadata. - Name:
That's it. "Save to Matter" now appears in the article share menu.
npm run dev # wrangler dev on http://localhost:8787
npm run tail # live logs from the deployed WorkerSmoke test against local dev:
curl "http://localhost:8787/save?key=$SHARED_KEY&url=https://example.com/article"-
The Matter token is the only real credential, and it's a Worker secret — never in the repo, never in the URL.
-
The
SHARED_KEYis a low-value gate, not a credential. It lives in the Feedbin URL by necessity (Feedbin can only open a GET URL — no custom headers, no interactive auth). Anyone with the full URL including the key can add articles to your queue; that's the worst they can do (no reads, no deletes, no token exposure), and it's fully reversible. Keep the URL private. -
Rotate the key any time without a code change:
npx wrangler secret put SHARED_KEY # paste a new value, then update the Feedbin URL
- Matter processing is async: ~40% of saves complete instantly (cached content);
the rest finish extracting in 20–60s. A
200means "accepted," not necessarily "fully parsed."