auth: 'Sign out all devices' — expose sign-out-everywhere sentinel
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 68/100
- Issue type
- Feature
- Clarity
- Mostly clear
- Activity status
- Quiet
- Tech stack
- typescript
- Domain
- api, authentication, documentation, frontend
Research direction
Start with apps/api/src/auth/revocation.ts and specs/behaviors/authorization.md to understand the existing '*' sentinel, then inspect the API auth endpoint structure and apps/web/src/screens/Account.tsx. The work is done when an authenticated user can trigger the all-device revocation, the Account screen exposes it, and the endpoint and action tables are updated in specs/api/auth.md and specs/screens/account.md.
Written by the indexing model from the issue text.
Description
What's missing
`specs/behaviors/authorization.md` describes a `jti = '*'` sentinel in the revocations sheet that revokes every JWT for a personId whose `iat` precedes the sentinel's `revokedAt`. The verifier-side code at `apps/api/src/auth/revocation.ts` fully implements the sentinel.
But there's no way for a user to trigger it. No API endpoint exposes "sign out all devices," and the Account screen (`specs/screens/account.md`) only offers "Sign out of this session." A user whose phone is lost can revoke that one session but can't blast every JWT issued before now.
Fix shape
- Add `POST /api/auth/logout-all` (or `POST /api/auth/sessions/revoke-all`) — writes a sentinel `Revocation` with `jti = '*'`, `personId = caller.id`, `revokedAt = now`.
- Add a "Sign out of all devices" button to the Account settings screen (`apps/web/src/screens/Account.tsx`).
- Update `specs/api/auth.md` endpoints table + `specs/screens/account.md` Actions table.
Why it's worth the work
Compromised-device recovery is a real account-security need. The hard part (the verifier-side sentinel) is already done; this is just plumbing.
Identified during the 2026-05-30 post-cutover-blog spec-drift audit.
- Dominant language
- TypeScript
- Stars
- 1
- Forks
- 1
- Avg merge
- 1d 20h
- Merged PRs (30d)
- 25
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from CodeForPhilly/codeforphilly-ng
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
-
MarkdownEditor toolbar: use Radix Toolbar from radix-ui instead of the hand-rolled roving tabindex Openenhancement
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
All issues in CodeForPhilly/codeforphilly-ng
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
copse-dev/agent-pane#2953 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
Eynzof/Hermes-CN-Desktop#610 ·
-
bug clawsweeper:linked-pr-open clawsweeper:needs-live-repro clawsweeper:no-new-fix-pr impact:message-loss issue-rating: 🐚 platinum hermit P2 regression
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
-
calcite-components needs triage refactor
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
Esri/calcite-design-system#15203 ·