Sign in to an Account (app scaffold + session) #10

Closed
opened 2026-08-02 19:26:29 +00:00 by TheAnachronism · 2 comments

What to build

A runnable Flutter Android app (Material 3, dark by default, Riverpod, ADR-0001 feature/domain/data seams) where a person with no Accounts lands on Sign-in, connects to a tt-rss instance (base URL, username, password, optional display name), and after a successful login with api_level ≥ 23 is taken to the List hub shell with Fresh Selection and the Unread filter on. The Account (secrets + sid + active id) survives process death; cold start restores the active Account and skips Sign-in. Bad credentials, API disabled, and network/TLS failures are shown clearly — never silently.

Handoff context: docs/mvp-spec.md, CONTEXT.md, ADR-0001, docs/research/.

Acceptance criteria

  • App boots on Android (emulator or device) with Material 3 dark chrome and Riverpod wired; project layout follows ADR-0001 seams (feature folders + domain + data)
  • With zero Accounts, root is Sign-in; successful Sign-in navigates to List hub shell with Fresh + Unread selection state ready
  • Sign-in normalizes base URL, calls login, requires api_level ≥ 23, and persists Account metadata + password/sid in secure storage + last active Account id
  • Cold start with a saved Account restores session routing (List hub, not Sign-in) without re-entering the password
  • LOGIN_ERROR, API_DISABLED, and network/TLS failures surface clear user-visible errors
  • Duplicate (normalized baseUrl, username) cannot create a second Account

Blocked by

  • None — can start immediately.
## What to build A runnable Flutter Android app (Material 3, dark by default, Riverpod, ADR-0001 feature/domain/data seams) where a person with no Accounts lands on **Sign-in**, connects to a tt-rss instance (base URL, username, password, optional display name), and after a successful login with `api_level` ≥ 23 is taken to the **List hub** shell with **Fresh** Selection and the **Unread filter** on. The **Account** (secrets + `sid` + active id) survives process death; cold start restores the active Account and skips Sign-in. Bad credentials, API disabled, and network/TLS failures are shown clearly — never silently. Handoff context: `docs/mvp-spec.md`, `CONTEXT.md`, ADR-0001, `docs/research/`. ## Acceptance criteria - [ ] App boots on Android (emulator or device) with Material 3 **dark** chrome and Riverpod wired; project layout follows ADR-0001 seams (feature folders + domain + data) - [ ] With zero Accounts, root is **Sign-in**; successful Sign-in navigates to **List hub** shell with Fresh + Unread selection state ready - [ ] Sign-in normalizes base URL, calls login, requires `api_level` ≥ 23, and persists Account metadata + password/`sid` in secure storage + last active Account id - [ ] Cold start with a saved Account restores session routing (List hub, not Sign-in) without re-entering the password - [ ] `LOGIN_ERROR`, `API_DISABLED`, and network/TLS failures surface clear user-visible errors - [ ] Duplicate (normalized baseUrl, username) cannot create a second Account ## Blocked by - None — can start immediately.
Author
Owner

Done

Implemented Sign-in + app scaffold on master.

Delivered

  • Flutter Android project (dev.anachronis.tt_rss_viewer) with Material 3 dark chrome, Riverpod, ADR-0001 folders (accounts, list, domain, data/{api,local})
  • SignIn use-case → AccountRepositoryPrefsAccountStore (prefs metadata + secure password/sid)
  • ApiClient bound to Account baseUrl + optional sid; login requires api_level ≥ 23; maps LOGIN_ERROR / API_DISABLED / network
  • Cold start: no Accounts → Sign-in; active Account → List hub shell with Fresh + Unread ready (headlines stub for #11)
  • Duplicate (baseUrl, username) rejected
  • Tests: flutter test 14 passed; dart analyze clean

Run

nix develop -c flutter run -d android (or -d linux)

## Done Implemented Sign-in + app scaffold on `master`. ### Delivered - Flutter Android project (`dev.anachronis.tt_rss_viewer`) with Material 3 **dark** chrome, Riverpod, ADR-0001 folders (`accounts`, `list`, `domain`, `data/{api,local}`) - **SignIn** use-case → **AccountRepository** → `PrefsAccountStore` (prefs metadata + secure password/`sid`) - **ApiClient** bound to Account `baseUrl` + optional `sid`; login requires `api_level` ≥ 23; maps `LOGIN_ERROR` / `API_DISABLED` / network - Cold start: no Accounts → Sign-in; active Account → List hub shell with **Fresh** + **Unread** ready (headlines stub for #11) - Duplicate `(baseUrl, username)` rejected - Tests: `flutter test` 14 passed; `dart analyze` clean ### Run `nix develop -c flutter run -d android` (or `-d linux`)
Author
Owner

Implemented on master: Sign-in scaffold + Account session.

Implemented on master: Sign-in scaffold + Account session.
TheAnachronism 2026-08-02 19:36:18 +00:00
Sign in to join this conversation.
No description provided.