Overview
API keys ([BE-24]) and webhooks ([BE-25]) need their admin UI — the "Developers" section of settings that every integratable platform has.
What to Build
A /settings/developers section (tab within the existing settings page or its own route):
- API keys panel: list (name, prefix, last used, status); create modal (name, optional expiry, scopes) showing the full key once with copy-to-clipboard and an explicit "you won't see this again" notice; revoke with confirm-dialog
- Webhooks panel: list subscriptions (URL, events, active, recent delivery status); create/edit modal (URL, event multi-select, generated signing secret shown once); enable/disable toggle; "send test" button surfacing the response code; per-subscription recent-deliveries drawer (timestamp, event, status, attempt)
- ADMIN-only section
Conventions to Follow
- API calls: add a typed client in
frontend/lib/api/ (see frontend/lib/api/assets.ts for the pattern) — never call axios directly from components
- Data fetching: TanStack Query hooks in
frontend/lib/query/hooks/ with keys registered in frontend/lib/query/keys.ts
- UI: reuse
frontend/components/ui/ (button, input, confirm-dialog, toast) and the badge/modal patterns in frontend/components/assets/
- Route goes under
frontend/app/(dashboard)/ and gets a sidebar entry in frontend/components/layout/sidebar.tsx
- Forms: React Hook Form + Zod resolver, matching the existing create-asset modal
References
- Blocked by [BE-24], [BE-25]
- Existing settings page to extend:
frontend/app/(dashboard)/settings/page.tsx
Acceptance Criteria
Overview
API keys ([BE-24]) and webhooks ([BE-25]) need their admin UI — the "Developers" section of settings that every integratable platform has.
What to Build
A
/settings/developerssection (tab within the existing settings page or its own route):Conventions to Follow
frontend/lib/api/(seefrontend/lib/api/assets.tsfor the pattern) — never call axios directly from componentsfrontend/lib/query/hooks/with keys registered infrontend/lib/query/keys.tsfrontend/components/ui/(button, input, confirm-dialog, toast) and the badge/modal patterns infrontend/components/assets/frontend/app/(dashboard)/and gets a sidebar entry infrontend/components/layout/sidebar.tsxReferences
frontend/app/(dashboard)/settings/page.tsxAcceptance Criteria