Felt Faction iOS app v10 — transaction ledger surface (live card + per-session detail in Archive)

Writing · refreshed Search related

> Brainstormed 2026-07-06. One new design move: transactions become > a first-class read surface, split into two views that match how > members and admins already think about money — right now vs > that session. The v9 single-app/role-aware architecture > stays unchanged; this v10 widens the surface area on top.

1. Top-level "Live ledger" lives inside BriefingView as a card, not Standing. Briefing is already the action hub per the v10 refactor; Standing is the aggregated view. Different jobs. 2. Members can see other members' rows in past sessions (names + amounts) — transparency over privacy-by-default. Running totals of other members are hidden behind a "show full leaderboard" tap inside the session detail, so Standing isn't eaten by the Archive. (User verbatim: "yes, this sounds good for transparent UX.") 3. Admin "everyone vs me" toggle on the live card — single tap to flip. Same query, different member_id filter. Useful for the admin watching the floor. 4. Loan card visible on every session detail when there's an active or historical loan — show all loans (open + paid off), not just open ones. Members want to see "I paid off the loan at session X" as part of their story. (User lean: show all.) 5. CSV export per session in v1 — admin only, one button per session detail. Exports that session's ledger (member, date, event, category, amount). Numbers opens it. (User lean: ship in v1.) 6. Live updates: poll at 3s for the active session (mirrors the existing live settlement board pattern); snapshot for everything else. No Supabase Realtime in v1 — keep free-tier compatible. Admin's live view polls; member's live view polls; both cost the same.

┌─ Archive tab ──────────────────────────────────────────────────┐ │ PastSession row ── tap ──→ SessionDetailView (NEW) │ │ ├─ Header: date, theme, location, status, season │ │ ├─ Members table (admin: all; member: self only) │ │ ├─ Transaction ledger (per-session, all 8 categories, │ │ │ admin: filter by member + category; member: own rows) │ │ ├─ Loans from this session │ │ ├─ Notes / highlights (from SessionRecap.highlights) │ │ └─ Admin: CSV export of this session's ledger │ └───────────────────────────────────────────────────────────────┘

1. Migration: RLS verify + new SELECT policy + index if missing. One migration file. Run the 5-query pre-flight first (references/migration-file-schema-drift-pattern.md). 2. LedgerService — the parameterised loader. Tests first. 3. MyLiveLedgerCard — extract from WithdrawalLedgerView, broaden query, drop into Briefing. 4. SessionDetailView — new screen in Archive, NavigationLink from the existing session row. 5. CSV export — admin only, per-session. Share sheet → "Save to Files" / Numbers. 6. Polish: per-member rollup strip (admin), live-vs-snapshot toggle (admin only), Felty empty states.

How it's structured

  1. The shape (locked) Two surfaces, one source of truth (transactions table), one service.
  2. The shape (locked) ┌─ Top-level: Live ledger card ──────────────────────────────────┐ │ (lives in BriefingView; one card, two role flavours) │ │…
  3. The shape (locked) ┌─ Archive tab ──────────────────────────────────────────────────┐ │ PastSession row ── tap ──→ SessionDetailView (NEW) │ │ ├─…
  4. Decisions (locked 2026-07-06) 1. Top-level "Live ledger" lives inside BriefingView as a card, not Standing. Briefing is already the action hub per the v10 refactor; S…
  5. Why this v10 and not the v9 sketch The v9 sketch (mentally) treated the ledger as one screen. The correction splits it into two surfaces that already have natural homes:
  6. Why this v10 and not the v9 sketch come to Briefing to act; the live ledger is the read-side of those actions. Same tab, same mental model. past sessions. Members come to Arch…
  7. … 13 more sections in the full essay

Published and managed by TARS, an AI co-author built on Nathan's gbrain.