Skip to content

feat(web): Developers page to manage API keys - #225

Merged
josue-commits merged 7 commits into
developfrom
feat/api-v1-developers-page
Oct 13, 2026
Merged

josue-commits merged 7 commits into
developfrom
feat/api-v1-developers-page

Conversation

@josue-commits

Copy link
Copy Markdown
Contributor

Summary

Adds a Developers page to the admin rail where workspace members can create, view and revoke API keys for the public v1 API. A new key's secret is shown exactly once, then dropped.

Changes

  • @quill/shared: EN and ES catalog copy for the Developers page and its rail item.
  • Admin rail: new Developers item with active state on the route and below it.
  • Server actions to create and revoke keys, all routed through callAction, mapped to the /v1/api-keys contract (including the key limit error).
  • Developers page: key list with a role-based "Created by" column, empty and error states, create dialog that shows the secret once (dropped on Done, Escape or backdrop), revoke with confirmation. Responsive layout that stacks below md.
  • Changeset for @quill/shared.

How it was tested

  • pnpm typecheck: 16/16.
  • Full suite green: web 1247, api 732, db 345, shared 71, engine 436, destinations 125, types 59, notifications 57. Developers specs: 40.
  • PUBLISH_GATE_LOCAL=1 pnpm run publish-gate: passed. pnpm changeset status: OK.
  • Layout checked visually with next build + next start.

Review notes

An independent review found and fixed (commit 02e6be4, with tests):

  • Revoke treated a 404 as success. A 404 now returns a GONE error and shows a dedicated message instead of a success toast.
  • Escape or a backdrop click could close the create dialog while the request was in flight, losing the secret. The dialog now cannot close while pending.
  • Overlapping revokes could clear each other's spinner. The pending state is now cleared per row.
  • The page now loads the current member and the key list in parallel.

Coordination

The sibling PR for the developer docs page also adds developer-docs.tsx; expect an add/add conflict there when the second one merges.

🤖 Generated with Claude Code

josue-commits and others added 7 commits October 12, 2026 16:54
Adds admin.chrome.nav.developers, admin.developers (the API keys section:
list, empty and error states, create dialog with the one-time reveal,
revoke confirmation, KEY_LIMIT message) and admin.developerDocs (the docs
placeholder), in English and Spanish.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Josue Hernandez <josue@daptatech.com>
Between Integrations and Docs, in the desktop rail (open and collapsed)
and the mobile drawer, active on /admin/developers and below it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Josue Hernandez <josue@daptatech.com>
Client methods for GET/POST /v1/api-keys and DELETE /v1/api-keys/:id,
built against the spec contract, and the two server actions the page
calls through callAction. Refusals come back as stable codes (INVALID,
KEY_LIMIT, FORBIDDEN, FAILED); a 404 on revoke counts as already revoked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Josue Hernandez <josue@daptatech.com>
/admin/developers lists the caller's keys (all of the workspace's, with
who created each, for owners and admins), creates a key in a dialog that
shows the full key once with a copy button and a warning, and revokes
with confirmation. Empty and error states, no horizontal scroll on a
phone. The docs section is a placeholder component, DeveloperDocs in
developer-docs.tsx, that the docs ticket replaces as a unit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Josue Hernandez <josue@daptatech.com>
A "use server" file may export async functions only, so the key name
limit moves to its own module, and the client panel imports only types
from admin-api (the module reads the session cookie and cannot reach a
client bundle). vitest stubs both, so only the production build saw it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Josue Hernandez <josue@daptatech.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Josue Hernandez <josue@daptatech.com>
- A 404 on revoke is no longer reported as a revoke. The API answers 404
  for a key of another workspace too, which happens when the workspace
  changed in another tab; the page now says the key is no longer in this
  workspace and refreshes the list (GONE, new catalog string EN + ES).
- The create dialog stays open while the key is being created, so Escape
  or a backdrop click cannot create a key whose secret is never shown.
- Overlapping revokes no longer clear each other's busy state.
- The page reads /v1/me and the key list in parallel.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Josue Hernandez <josue@daptatech.com>
@josue-commits
josue-commits force-pushed the feat/api-v1-developers-page branch from 02e6be4 to a4b7137 Compare October 13, 2026 00:14
@josue-commits
josue-commits merged commit 2097749 into develop Oct 13, 2026
6 checks passed
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