feather-reader 0.2.2

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

{% block title %}Sign in — FeatherReader{% endblock %}

{% block body %}
<main class="auth">
  <div class="auth-card">
    <svg class="auth-mark" viewBox="0 0 24 24" fill="none" stroke="currentColor"
         stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
      <path d="M20.2 4.6c-2.3-2.3-7.2-1.4-10 1.4C7.4 8.8 4 17 4 20c3 0 11.2-3.4 14-6.2 2.8-2.8 4.5-6.9 2.2-9.2z"/>
      <path d="M16 8 5 19"/>
    </svg>

    <h1 class="auth-name">FeatherReader</h1>
    <p class="auth-tag">read, quietly</p>

    {% if !error.is_empty() %}
      <p class="flash error" role="alert">{{ error }}</p>
    {% endif %}
    {% if !flash.is_empty() %}
      <p class="flash" role="status">{{ flash }}</p>
    {% endif %}

    <form class="auth-form" method="post" action="/login">
      <label for="handle">Your atproto handle</label>
      <input class="input" id="handle" name="handle" type="text"
             placeholder="alice.bsky.social" autocomplete="username"
             autocapitalize="none" autocorrect="off" spellcheck="false" required />
      <button class="btn btn-primary" type="submit">
        Continue
        <span class="htmx-indicator spinner" aria-hidden="true"></span>
      </button>
    </form>

    <p class="auth-why">
      <strong>No signup. No password. No account here at all.</strong>
      Your atproto identity is your account — you'll approve access on your own
      server (Bluesky, or a PDS you host) via the real atproto <strong>OAuth</strong>
      flow, and FeatherReader never sees your password. Your subscriptions, folders,
      stars, and read-state are stored as open-standard records in <strong>your</strong>
      PDS, portable to any reader that speaks <code>community.lexicon.rss.*</code>.
    </p>

    <p class="auth-foot">
      Open source · <a href="{{ repo_url }}" rel="noopener noreferrer">AGPL-3.0</a> · self-hostable
    </p>
  </div>
</main>
{% endblock %}