Skip to content

Suite 38 — password-required accounts + decoupled newsletter - #39

Merged
aryavenkatesan merged 2 commits into
mainfrom
feat/suite-38-password-newsletter
Jul 31, 2026
Merged

Suite 38 — password-required accounts + decoupled newsletter#39
aryavenkatesan merged 2 commits into
mainfrom
feat/suite-38-password-newsletter

Conversation

@aryavenkatesan

Copy link
Copy Markdown
Collaborator

Suite 38 — password-required accounts + decoupled newsletter

Orchestrated build of all 8 tickets. Backend 114 tests OK, makemigrations --check clean; frontend pnpm build + pnpm test 33/33 green.

Track A — password-required accounts

  • 38.A1 Remove passwordless lazy-auth (/enter) plugin; keep jwt()/nextCookies().
  • 38.A2 Portal "Create Account" → single-step email+password+confirm via Better Auth signUp.email; delete set-password route/form/API + AccountBanner nag.
  • 38.A3 Drop derived has_password from /auth/me + /events/me/profile; delete user_has_password helper + frontend types/tests.
  • 38.A4 (prepare-only) rollover_passwordless_accounts management command + docs/suite-38-passwordless-rollover.md. No emails sent.

Track B — decoupled newsletter + digests

  • 38.B1 NewsletterSubscriber.manage_token (unique UUID) + migration 0019 with per-row backfill.
  • 38.B2 /auth/subscribePOST /newsletter/subscribe (+ welcome email); public GET/PATCH /newsletter/manage?token=; me PATCH NEVER now deactivates (row + token survive) instead of deleting.
  • 38.B3 Single NewsletterSubscriber-driven _build_recipients resolver backs both tasks and command; fan_out_monthly_digest + beat seed 0020 (1st @ 18:00 ET); manage/unsubscribe footer in every digest email.
  • 38.B4 Footer inline signup, public /newsletter/manage page, Sidebar/DigestCTAPusher no longer route to /join.

Docs

  • 38.D1 ARCHITECTURE.md, PROJECT_CONTEXT.md, root/backend/web AGENTS.md, docs/redis-celery-handoff.md corrected — no live doc describes passwordless/has_password//auth/subscribe.

⚠️ Follow-ups surfaced (out of scope, need separate tickets)

  1. Passwordless rollover is blocked, not just un-run. Better Auth sendResetPassword isn't configured (→ RESET_PASSWORD_DISABLED), and /forgot-password is a stale stub that calls no API (no /reset-password/[token] page). Existing passwordless accounts have no working path to set a password until the reset flow is wired. Command + runbook are ready to send once it is.
  2. Model/schema drift: BetterAuthAccount.user_id is a Django TextField but live neon_auth.account."userId" is uuid (ORM joins fail with operator does not exist: uuid = text). Worked around with raw SQL in the rollover command.

🤖 Generated with Claude Code

aryavenkatesan and others added 2 commits July 31, 2026 08:57
…led newsletter

Track A — password-required accounts:
- Remove passwordless lazy-auth (/enter) plugin; portal signup now collects
  email+password+confirm in one step via Better Auth signUp.email (38.A1/A2)
- Delete set-password route/form/API + AccountBanner nag (38.A2)
- Drop derived has_password from /auth/me and /events/me/profile (38.A3)
- Add rollover management command + runbook for existing passwordless accounts
  (38.A4, prepare-only — reset flow needs wiring before send; see doc)

Track B — decoupled newsletter + digests:
- NewsletterSubscriber.manage_token (unique UUID) as single digest source (38.B1)
- POST /newsletter/subscribe (email-only + welcome mail) and public token-managed
  GET/PATCH /newsletter/manage?token=; me PATCH NEVER now deactivates, not deletes (38.B2)
- One NewsletterSubscriber-driven recipient resolver backs tasks + command;
  add scheduled monthly digest + manage/unsubscribe link in every email (38.B3)
- Footer inline signup, public /newsletter/manage page, Sidebar/DigestCTA no
  longer route to account creation (38.B4)

Docs refreshed for password-required auth + decoupled newsletter (38.D1)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@aryavenkatesan
aryavenkatesan merged commit d5f342a into main Jul 31, 2026
5 checks passed
@aryavenkatesan
aryavenkatesan deleted the feat/suite-38-password-newsletter branch July 31, 2026 15:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant