offline-first, p2p synced, atproto enabled, feed reader
TypeScript 95.1%
CSS 2.4%
JavaScript 1.9%
Dockerfile 0.3%
HTML 0.1%
Nix 0.1%
Just 0.1%
Shell 0.1%
Other 0.1%
56 1 0

Clone this repository

https://tangled.org/accidental.cc/feedline
git@tangled.org:accidental.cc/feedline

For self-hosted knots, clone URLs may differ based on your setup.

README.md

Feedline#

Easily self-hosted, local-first RSS reader and podcast client with p2p sync, and optional ATProto based social discovery.

  • Subscriptions, read/play state and other actions sync between devices p2p
  • Media can be downloaded with analysis for skipping silence, and shared via public or private torrent swarm
  • Optional atproto integration allows easy on-boarding, and sharing subscriptions/favorites/etc through an open social network

development#

  • node.js 24+
  • pnpm
  • there's a justfile if you want
pnpm install
pnpm run dev
# - frontend at `http://localhost:4000` (or configured port)
# - backend server at `http://localhost:4001`, `ws://localhost:4001/_stream` (proxied through vite)

pnpm test
pnpm run types
pnpm run lint -- --fix

# production (heh)
pnpm run build
pnpm run start:prod

status: early#

  • lots of neat ideas
  • lots of getting nerd-sniped

The core realm protocol is working, but feed/podcast features are still being built. Don't use this yet.

re: LLM usage#

Do you know what the most recent coding LLMs are really, really good at? Having a two hour back and forth conversation about an idea you have, and then writing that up into a design document that's coherent enough to read and think about later.

Also, Opus 4.5 is really good at complicated typescript types, heh.

The way that I like to use LLMs is as rubber ducks; a mirror made of compressed internet that I can I talk to, in order to figure things out. Like, I want a contributors Slack, but without any latency, social pressure or conforming to another person's interest (or lack thereof). I'm not asking some rando on #feedline-at to write my code, anymore than I'm asking Claude to, but it's really nice to have an impassioned conversation.

what I can confidently say:#

  • I have touched every line of (live) code in this repository
  • I can explain every line of (live) code in this repository

what I cannot confidently say:#

  • I have written every line of code in this repository
  • That every idea here is entirely of my own spontaneous creative genius

Take of all that what you will.

self-hosting#

feedline is designed to be self-hosted:

  1. hosted - run the web app from https://app.feedline.at, and we use the following:
  • upstream CORS proxy
  • upstream reader-mode proxy
  • audio file downloads for analysis (when not marked private)
  1. home server - run a local server for your devices (via Docker/Podman)
  • should support mdns, client connects, gets PWA, server does syncing
  • "discovery" and other social features would still come from upstream if that's desired

ATProto integration#

feedline integrates with ATProto for:

  • easy cross-device bootstrapping

    • if both devices are signed in through ATProto OAuth, we don't have to worry about invitation
  • social & discovery

    • sharing subscriptions means we can track common ones, trending, all that good stuff
    • sharing "shares" or "favorites" or whatever gives nice google-reader vibes
    • share to bluesky / some sort of native commenting or whatever would be easy/useful

ATProto should never be required - offline first with a self-hosted server for fetching should always work.

license#

AGPL