Syndicate elsewhere
A simple, local-first publishing dashboard for syndicating blog posts and podcast episodes from RSS feeds to social platforms like Bluesky and Mastodon.
Overview
Syndicate Elsewhere is a lightweight, single-page HTML/JavaScript app that acts as a manual syndication inbox. It reads one or more RSS feeds, identifies content that has not yet been syndicated, and presents a queue of publishable items. You can review, edit, and publish a generated social post to one or more destinations with a single click.
The application is intentionally local-first, single-user, and manual rather than automated. RSS remains the source of truth — the app only stores references to feed entries plus your publication state. Everything lives in browser localStorage; there is no backend.
Features
- Multiple feeds — add blog and podcast RSS/Atom feeds, validate them, edit and delete them.
- Manual refresh — pull all feeds and build a queue of unpublished items.
- Auto-generated drafts — editable templates per content type with variables like
{title},{url},{shortDescription}. - Composer — edit post text, pick destinations, see a character counter, and publish.
- Per-destination publication tracking — partial publication and retries are supported; an item leaves the queue only once it is published everywhere enabled.
- Skip items you don't want to syndicate.
- Bluesky publishing via ATProto (handle + app password), with link facets and a basic link card.
- Mastodon publishing via the REST API (instance URL + access token).
- Themes (system / light / dark), queue ordering, and optional 15-minute auto-refresh.
- Export / import your full configuration as JSON.
Usage
- Open
index.htmlin a browser (or runnpm startfrom the repo root). - Go to Settings and enable Bluesky and/or Mastodon, entering your credentials. Use Test Connection to verify.
- Go to Feeds, add an RSS feed (Name, URL, Type), optionally Validate Feed, then Save Feed.
- Click ↻ Refresh Feeds in the header.
- On the Queue, click Compose & Publish on a card, edit the draft, choose destinations, and Publish Selected.
- Return later and refresh — only content you haven't fully published (and haven't skipped) appears.
CORS proxy
Most RSS feeds do not send CORS headers, so browsers block fetching them directly. Syndicate Elsewhere tries a direct fetch first and falls back to a configurable CORS proxy (set in Settings → General). The Bluesky and Mastodon APIs themselves are called directly and support CORS.
The default proxy is /rss-proxy?url=, served by the bundled Netlify edge function at netlify/edge-functions/rss-proxy.ts (the deployed equivalent of a Cloudflare Worker). It works automatically on the deployed Netlify site, or locally when you run netlify dev. The function only proxies http(s) URLs and refuses localhost / private-network targets to avoid being an abusable open proxy.
For other local setups (e.g. opening the file directly or npm start), either run netlify dev, or change the proxy to a public one such as https://api.allorigins.win/raw?url=, or clear it to disable the fallback.
Templates
Each content type has an editable template. Available variables:
{title} · {url} · {summary} · {shortDescription} · {description} · {author} · {feedName} · {publishedDate}
Defaults:
Blog: New post: {title}\n\n{url}
Podcast: New episode: {title}\n\n{shortDescription}\n\nListen: {url}
Data & Security
All state — feeds, templates, credentials, and publication history — is stored under the syndicateElsewhere key in browser localStorage. Credentials (Bluesky app password, Mastodon token) are stored in plain text locally, which is acceptable for a single-user, local-first tool with no shared backend. Use app passwords / scoped tokens, and use Reset All Data to wipe everything.
Technical Details
- Pure HTML/CSS/vanilla JavaScript — no frameworks, no build step.
index.html(markup + styles) andapp.js(logic).- RSS 2.0 and Atom parsing via the browser
DOMParser. - Bluesky via ATProto XRPC; Mastodon via REST.
Browser Compatibility
Works in modern Chrome, Firefox, Safari, and Edge.
Roadmap
Planned future enhancements include image/OpenGraph support, platform-specific drafts and preview cards, LinkedIn (OAuth), scheduling, batch publishing, AI-assisted drafts, and additional destinations (Threads, Discord, Ghost, Micro.blog, etc.).
License
See repository root for license information.