You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Admin route to delete an active account on request #471
After #412, the admin ghost-account delete refuses any account that is not a ghost. So there is no route that deletes an active account when its owner asks for that under the privacy promise. An operator must do it by hand today.
Manual path until this lands: clear the same fields the helper clears. Set deleted_at, null full_name, avatar_url and avatar_updated_at, set profile_data to {}, set username to deleted_ plus 12 hex characters of the id, remove the {id}/ objects in user_avatars, and ban the user.
Fix
Add an admin route, for example DELETE /api/admin/users/:id, behind the existing admin guard. Validate :id as a uuid.
Export softDeleteUsers and call it for that one id.
Refuse an admin. Revoke admin access first through public.admin_revoke_admin.
Add the route to the OpenAPI admin paths and to apps/hocuspocus.server/API.md.
Acceptance
An admin can soft-delete one active, non-admin account, and every field above is cleared.
An erased (soft-deleted) account must get no bell rows, as push and email already do.
Built: one more check in the BEFORE INSERT trigger internal.skip_unopenable_notification on public.notifications, with paired migration 20261019120000_skip_notification_for_deleted_receiver. The trigger's channel filter was removed, so an alert with no channel, such as an email bounce, is gated too. It was checked on the local database in a rolled-back transaction, including a sabotage run.
The work is in the maintainer's working tree and is not committed or pushed yet.
Fixed in the maintainer's working tree on main. It is not committed or pushed yet, so there is no commit to link. It ships with the next push. Closed at the maintainer's request, 2026-10-19.
Activity
HMarzban commentedon Oct 19, 2026
Maintainer ruling, 2026-10-19
An erased (soft-deleted) account must get no bell rows, as push and email already do.
Built: one more check in the
BEFORE INSERTtriggerinternal.skip_unopenable_notificationonpublic.notifications, with paired migration20261019120000_skip_notification_for_deleted_receiver. The trigger's channel filter was removed, so an alert with no channel, such as an email bounce, is gated too. It was checked on the local database in a rolled-back transaction, including a sabotage run.The work is in the maintainer's working tree and is not committed or pushed yet.
HMarzban commentedon Oct 19, 2026
Fixed in the maintainer's working tree on
main. It is not committed or pushed yet, so there is no commit to link. It ships with the next push. Closed at the maintainer's request, 2026-10-19.fix(supabase): harden grants and notification gates
feat(admin): soft-delete an active account on the owner's request
docs(hocuspocus): record the server changes for 2.2.0