feather-reader 0.4.5

A minimalist, atproto-native RSS/Atom reader in Rust — your feed subscriptions live in your own PDS.
Documentation
{% extends "base.html" %}

{% block title %}About — FeatherReader{% endblock %}

{% block body %}
<div class="shell shell-plain" id="shell">
  <header class="topbar">
    <a class="icon-btn" href="/" aria-label="Back">
      <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8"
           stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
        <path d="M15 5l-7 7 7 7"/>
      </svg>
    </a>
    <h1 class="topbar-title">About</h1>
    <span class="icon-btn" aria-hidden="true"></span>
  </header>

  <main class="content" id="content">
    <div class="about">
      <h1>FeatherReader is a calm, quiet reader — and a public experiment.</h1>

      <p class="about-lede">
        A typography-first reader of RSS feeds and standard.site publications,
        for people who left algorithmic feeds on purpose. Read, quietly.
      </p>

      <h2>This is an experiment</h2>
      <p>
        FeatherReader is run as a public experiment with <strong>no service-level
        agreement and no uptime guarantee</strong>. It may change, break, slow down,
        or be paused at any time, without notice. Please don't rely on it as your
        only reader — treat it as something to try, not something to depend on.
      </p>

      <h2>Your data lives in your PDS</h2>
      <p>
        There is no account here. You sign in with your own atproto identity, and
        your subscriptions, folders, stars, and read-state are written as
        open-standard <code>community.lexicon.rss.*</code> records in
        <strong>your own PDS</strong> — not on this server. Because your data is
        yours and portable, you can walk away at any time and take it with you.
        OPML export is always available, because leaving must be as easy as arriving.
      </p>
      <p>
        Because that PDS is <strong>public</strong>, FeatherReader supports
        <strong>public feeds only</strong> for now: a private or paid feed carries
        its secret in the URL, and this server never stores or writes such a secret
        anywhere. Private/paid-feed support will arrive when atproto's permissioned
        data (private records) ships.
      </p>

      <h2>RSS feeds and standard.site publications</h2>
      <p>
        FeatherReader reads two kinds of subscription. One is the ordinary public
        RSS or Atom feed. The other is a
        <a href="https://standard.site" rel="noopener noreferrer">standard.site</a>
        publication: a <code>site.standard.publication</code> record in the
        author's own atproto repo, whose articles are
        <code>site.standard.document</code> records in the same repo. There is
        no feed document to fetch — FeatherReader reads those records directly,
        without signing in to anything, and shows each article's title, date,
        link and plain-text summary. It deliberately does not render a
        document's rich <code>content</code>, which differs from one publishing
        platform to the next; the link takes you to the article as the author
        published it.
      </p>
      <p>
        A publication subscription is the same
        <code>community.lexicon.rss.subscription</code> record as a feed, with
        the publication's <code>at://</code> URI where a feed URL would be, so it
        is just as portable. Publications are re-read on the same interval as
        feeds and sit beside them in the reading list, in order.
        {% if standard_site %}
          To subscribe, paste <code>at://did:plc:…/site.standard.publication/…</code>
          into the subscribe form — or the handle form
          <code>at://alice.example.com/site.standard.publication/…</code>, which
          is resolved to its DID before it is saved. Only the DID form is stored,
          because a handle is a mutable name for an account.
        {% else %}
          This instance isn't accepting new publication subscriptions yet;
          publications it already follows are still read.
        {% endif %}
        The <a href="/standard-site">standard.site page</a> has the whole
        story, including what is deliberately not done.
      </p>

      <h2>Open source &amp; self-hostable</h2>
      <p>
        FeatherReader is free software under the
        <a href="{{ repo_url }}" rel="noopener noreferrer">AGPL-3.0</a>. You can read
        the code, file issues, or run your own copy — a single static binary plus a
        small OAuth sidecar. If you'd rather not depend on this instance, self-hosting
        is a first-class path.
      </p>

      <h2>Support the experiment</h2>
      <p>
        If FeatherReader is useful to you and you'd like to help keep it running,
        you can <a class="tip-link" href="{{ kofi_url }}" rel="noopener noreferrer">leave a tip ♥</a>.
        It's a solo project; there's no obligation, and the reader stays free either way.
      </p>

      {% if let Some(a) = adoption %}
      <p class="about-meta">
        {% if a.truncated %}At least {{ a.repos }}{% else %}{{ a.repos }}{% endif %}
        {% if a.repos == 1 %}account on the atproto network holds{% else %}accounts on the atproto network hold{% endif %}
        <code>community.lexicon.rss.subscription</code> records, as of
        <time datetime="{{ a.observed_on }}">{{ a.observed_on }}</time>.
        Relays only index the hosts they crawl, so this is a lower bound.
      </p>
      {% endif %}
    </div>

    <div class="colophon">
      <img src="/static/jts-colophon.svg" alt="JTS" width="44" height="44" />
      <p>Built by <a href="https://justin-stanley.com" rel="noopener noreferrer">Justin Stanley</a></p>
    </div>

    {% include "footer.html" %}
  </main>
</div>
{% endblock %}