--- type: guide title: Admin — General Settings description: How an admin edits global platform settings (page title, logo, theme, event window, default challenge IP, registrations, welcome Markdown) from the /admin/general page. tags: [guide, admin, settings, general, tester] timestamp: 2026-07-22T12:00:00Z --- # When this view is available The General Settings page is rendered at `/admin/general` for users with `role === 'admin'` once the instance is initialized. It is reached from the [Admin Shell](/guides/admin-shell.md) side-nav (`General` entry) or by navigating directly to the URL. | Layer | File | Check | |------------------|----------------------------------------------------------------------------|------------------------------------------------| | Client route | `frontend/src/app/app.routes.ts` | `/admin/general` child of `adminGuard`. | | Client component | `frontend/src/app/features/admin/general.component.ts` | `AdminGeneralComponent.ngOnInit` fetches settings + themes. | | Client predicate | `frontend/src/app/features/admin/general.pure.ts` (`deriveEventState`) | Computes the read-only event-state label. | | Server route | `backend/src/modules/admin/admin-general.controller.ts` | `GET/PUT /api/v1/admin/general/settings` + `GET /api/v1/admin/general/themes`. | # How to access (tester steps) 1. Sign in as an admin user (see [First-Run Bootstrap](/guides/bootstrap.md) if no admin exists). 2. Open the username menu in the shell header and click **Admin area**, or use the side-nav's **General** entry, or visit `/admin/general` directly. 3. The page renders a `Loading settings...` placeholder while the initial `GET /api/v1/admin/general/settings` + `GET .../themes` requests are in flight. # Fields The page is a single reactive form with these controls (every `data-testid` listed is asserted in the existing test suite): | Label | `data-testid` | Backend field | Notes | |------------------------|---------------------------|-------------------------|-------| | Page title | `general-pageTitle` | `pageTitle` | Required, max 120 chars. | | Logo (file picker) | `general-logo-file` | `logo` (public URL) | Uploads via `POST /api/v1/uploads/logo`; the returned `publicUrl` is bound to a hidden input `general-logo`. | | Logo upload status | `general-logo-uploading` / `general-logo-error` / `general-logo-current` | — | Inline status text under the file picker. | | Global theme | `general-themeKey` | `themeKey` | `