Skip to content

Self-hosted Feed Loader

Beacon ships fully static — pages are HTML you upload to any host. A few widgets still need a server in front of cross-origin APIs that don’t send Access-Control-Allow-Origin:

  • Feed cards — RSS, Atom, and YouTube feeds (most providers don’t allow direct browser access)
  • Letterboxd tile — RSS feed

Beacon solves this with a thin caching proxy running on Cloudflare Workers. It is the only infrastructure dependency Beacon has, and it’s opt-in: every Beacon site has a Custom feed loader field (Wizard → Code).

https://rss.ignyte.me/fetch?url= is what every new Beacon site points at out of the box. It’s free, low-volume, and operated by the Beacon maintainer. Fine for personal sites.

No setup needed — leave the wizard field blank.

For higher-traffic sites, privacy concerns about routing visitor requests through someone else’s worker, or anyone who’d rather own the dependency. Cloudflare Workers’ free tier covers around 100,000 requests per day, which is more than enough for a personal Beacon site.

  1. Install wrangler (Cloudflare’s worker CLI) if you don’t have it:

    Terminal window
    npm install -g wrangler
    wrangler login
  2. Create a KV namespace (used to cache successful responses and serve them when the upstream feed is down):

    Terminal window
    wrangler kv namespace create FEED_CACHE

    Wrangler prints an id. Copy it.

  3. Edit worker/wrangler.toml in your Beacon folder. Replace the existing id under [[kv_namespaces]] with the one wrangler just gave you. Optionally rename the worker (the name = "rss-proxy" line) so it doesn’t collide with anyone else’s.

  4. Deploy:

    Terminal window
    cd worker
    wrangler deploy

    Wrangler prints a URL like https://rss-proxy.<your-account>.workers.dev.

  5. (Optional) Custom domain. In the Cloudflare dashboard, go to Workers & Pages → your worker → Settings → Triggers → Custom Domains, and add a subdomain you control (e.g. rss.example.com). Cloudflare provisions the TLS cert automatically.

  6. Plug it into Beacon. Open the wizard, go to Code → Custom feed loader, and paste:

    https://rss-proxy.<your-account>.workers.dev/fetch?url=

    Or https://rss.example.com/fetch?url= if you set a custom domain. The ?url= suffix matters — Beacon URL-encodes the upstream feed URL after it.

  7. Save and rebuild. Your generated site now routes feed and Letterboxd fetches through your worker.

See worker/rss-proxy.js in your Beacon folder for the source. In short:

  • Accepts ?url=<encoded-upstream> and fetches that URL server-side, returning the body with Access-Control-Allow-Origin: *.
  • 5-minute KV cache: re-requests within that window are served from cache (zero upstream load).
  • 10-second upstream timeout. If the upstream is down or slow, it falls back to the last successful cached response, so feeds keep showing during outages.
  • 2 MB response cap and http(s)-only URL validation — prevents the worker from being abused as a generic anonymizer.

If you don’t use feed cards or the Letterboxd tile, you can ignore the proxy entirely — none of the other widgets touch it. Now Playing, Now Reading, GitHub, Chess.com, Weather, and Countdown call their APIs directly from the browser (or, in the case of snapshot tiles, are captured at wizard-save time).