Developer Console

Target reader: developers using the local Alpha console to create projects, invite teammates, and review player feedback.

The developer console runs at http://localhost:4173 and talks to the admin API at http://localhost:4100 by default. Its public route is the product Landing page; authenticated routes provide the operational console.

Accounts now require email verification before tenant access. Access tokens bind a real server session; logout revokes the current session, while logout-all, password change/reset, disable and deletion revoke all applicable sessions. Old Alpha identities and data are not migrated. See Account and security for recovery, deletion, SMTP and retained-data boundaries.

Minimal example

cd ../echo-nebula-infra
./scripts/e2e-all.sh
open http://localhost:4173

Use Developer A to register, verify email and log in, create an organization, create a project, and create a project key. Invite Developer B from the team panel, copy the invitation token, then log in as Developer B and accept the token. Developer C should not see A's project or feedback.

An organization owner can change member roles or remove members from the organization panel. An admin can manage only non-owner members. The UI protects the last owner, waits for server confirmation before changing the role badge, and uses an inline two-step removal confirmation. Organization removal does not revoke direct project access.

Organization detail settings

Open /orgs/{organization_id} to view the organization identity and edit its display name. Members with the owner or admin role can edit the name; developer, qa, and viewer members see the same server-confirmed value in a read-only settings summary. A system_admin account receives no tenant editing privilege unless it also has an explicit owner or admin membership. The organization ID, current role, and slug are always read-only, and changing the name never changes the ID or slug.

The Console counts the raw draft against the 120 Unicode-code-point limit, trims surrounding whitespace, rejects an empty normalized name, and disables Save when the normalized draft is unchanged. Save sends only { "name": ... }; Discard restores the last server-confirmed organization. The page does not update its summary optimistically: it accepts the change only after the API returns a valid, complete Organization response with the same immutable identity fields. Names may match those of other organizations.

Project detail settings

Open /projects/{project_id} to view the project identity and settings. An organization owner/admin or direct project admin can edit the project name, SDK default locale, default environment, and the five SDK feature gates. Developer, QA, and viewer roles see the same server-confirmed values in read-only form. The project ID, current role, and slug are always read-only; changing the name does not change the slug.

The Console trims name and environment drafts, validates the exact zh-CN, en, or ja locale, disables Save when the normalized draft has no changes, and sends only changed top-level fields. If any feature toggle changes, the Console sends the complete screenshot, recent_logs, breadcrumbs, offline_queue, and contact object. Discard restores the last server-confirmed project. Save does not update the summary until the API returns a valid complete Project response. The SDK default locale affects SDK/player-panel content, not the Console UI language.

Project feature gates define what a project is allowed to offer; they are not player consent. Enabling screenshot, recent logs, or contact never preselects or records consent. Each newly opened feedback panel starts with screenshot, recent logs, and privacy confirmation unchecked, and contact is included only when the player explicitly enters it for that submission. Every report stores its own consent snapshot. breadcrumbs and offline_queue are project capabilities, not additional consent fields.

List pagination

The feedback list requests the real API in pages of 50 and shows the current range against total. Previous and Next are enabled from offset and has_more; changing project, status, category, or search resets to offset=0. If concurrent data or a filter change leaves the current offset beyond the result, the Console requests the last valid page instead of leaving a permanent empty page.

Other collections for which the current management UI needs complete context are aggregated automatically by following has_more: organization members/invitations, project members/invitations/keys, and feedback-detail attachments/comments. Every page must still be the exact { items, offset, limit, total, has_more } envelope, and total must remain consistent across pages; malformed or drifting responses are not merged as valid data. Organization and project navigation comes from the unpaginated Developer Graph, so the Console does not mistake a first 50-item page for the complete navigation graph.

Common mistakes

Next step

Run the Admin API examples and compare them with the console workflow.