Skip to main content
Admin Modules

Admin Dashboard

Central command hub for Arcturus-Prime site administration, content statistics, feature flags, and quick actions

February 23, 2026 Updated February 25, 2026

Admin Dashboard

The Arcturus-Prime admin dashboard lives at /admin and serves as the central command hub for every administrative task across the platform. It aggregates content statistics, surfaces feature flags pulled from Gitea, exposes probe data extracted from HTML comments, and provides one-click access to every subsystem through quick action buttons. The entire interface is wrapped in CosmicLayout with the AdminSidebar, CommandPalette, and NotificationSystem components loaded at the shell level.

Layout and Shell Components

When you hit /admin, the page renders inside CosmicLayout, the shared admin shell that provides consistent chrome across every admin route. Three critical subsystems initialize at this level:

AdminSidebar

The sidebar renders the full navigation tree for the admin section. Links are grouped by category: Content, AI Tools, Infrastructure, Security, and Settings. Each link shows an icon and label, and the active route is highlighted. The sidebar collapses on mobile into a hamburger menu. Navigation items are filtered based on the current user’s role and feature entitlements, so a demo user never sees links to sections they cannot access.

CommandPalette (Ctrl+K)

The command palette is a fuzzy-search overlay that activates with Ctrl+K (or Cmd+K on macOS). It indexes every admin route, every content item by title, every server in the homelab registry, and every AI model currently configured. Results are ranked by recency and frequency of access. Selecting a result navigates directly to that page or triggers the associated action. The palette also accepts shortcut commands like /new post, /sync github, and /run probe.

NotificationSystem

The notification system manages toast messages, persistent alerts, and real-time event streams. It connects to the server-sent events endpoint at /api/admin/events and displays notifications for build completions, content review requests, security scan results, and AI task completions. Notifications are categorized by severity: info, success, warning, and error. Unread counts appear as badges on the sidebar navigation items.

Content Statistics

The top of the dashboard renders a statistics bar with real-time counts pulled from the content index:

MetricSourceDescription
Total Posts/api/admin/content-index?collection=postsCombined count of all blog posts
Total Journals/api/admin/content-index?collection=journalAll journal entries across sessions
ReviewedFrontmatter reviewed: trueContent that has passed editorial review
Needs WorkFrontmatter needsWork: trueContent flagged for revision during review
DraftsFrontmatter draft: trueUnpublished content not yet visible on the public site

Statistics update on page load and can be manually refreshed with the reload button. The numbers drive the review queue badge count visible in the sidebar.

Feature Flags

Feature flags are loaded from a flags.json file stored in the Gitea repository. On dashboard load, the system fetches the current flag state and caches it in memory for the duration of the session. Flags control visibility of experimental features across both the admin panel and the public site.

The flag loading flow:

  1. Dashboard mounts and calls /api/admin/flags
  2. The API endpoint fetches flags.json from the Gitea API on gitea.Arcturus-Prime.com using the configured access token
  3. Flags are parsed and returned as a key-value map
  4. The dashboard stores flags in a reactive store accessible to all admin components

Example flags include enableContentLab, enableBuildSwarm, enableProbeStudio, and enableVoiceCheck. When a flag is disabled, the corresponding quick action button is hidden and the route returns a 403 if accessed directly.

Probe and Flag Extraction

The dashboard runs a probe extraction pass over all content files to surface metadata embedded in HTML comments. This system scans for specially formatted comments in Markdown content:

<!-- probe:security-scan status=pass timestamp=2026-02-20T14:30:00Z -->
<!-- flag:needs-review reason="outdated screenshots" -->
<!-- probe:link-check broken=3 total=47 -->

Extracted probes appear in a collapsible panel on the dashboard showing the most recent probe results across all content. This gives a quick health overview without needing to open individual files. The extraction runs against the content index and caches results, re-scanning only when content files change.

Quick Action Buttons

The dashboard presents six primary quick action buttons in a grid layout:

  • Servers — navigates to /admin/servers for the server management interface. Shows a green/red indicator based on the last health check of Altair-Link (10.42.0.199), Proxmox Izar-Host (10.42.0.2), Proxmox Tarn-Host (192.168.20.100 via Tailscale), and Meridian-Host (192.168.20.50 via Tailscale).
  • Security — navigates to /admin/security for the latest security scan results. Badge shows count of findings since last review.
  • New Post — opens the content editor at /admin/edit with a blank post template pre-loaded. The template includes default frontmatter with today’s date and the user’s display name as author.
  • Telemetry — opens the telemetry dashboard showing request counts, response times, and error rates across all API endpoints. Data sourced from the analytics pipeline.
  • AI Settings — navigates to /admin/argonaut for Argonaut agent configuration, model selection, and voice profile management.
  • GitHub Sync — triggers a manual sync between the Gitea repository at gitea.Arcturus-Prime.com and the GitHub mirror. Shows sync status and last sync timestamp. Uses the /api/admin/github-sync endpoint.

Each button renders as a card with an icon, label, and optional status badge. The grid is responsive: three columns on desktop, two on tablet, one on mobile.

Dashboard Profiles

Arcturus-Prime supports multiple dashboard profiles per user. A profile defines the visible widgets, their grid positions and sizes, and the theme colors for the user dashboard. Users with multiple profiles see a tab-style switcher at the top of their dashboard. Profiles are managed at /admin/dashboard-profiles and assigned to users at /admin/users.

Built-in Profiles

Six profiles ship with the code and cannot be modified:

  1. Admin — all 13 core widgets (infrastructure, media, sites, tools). Default for admin role. Cyan/violet theme.
  2. Member — sites, deploy, media suite, editor, workbench. Default for member role. Blue/cyan theme.
  3. Demo — sites, plex, tautulli only. Default for demo role. Slate/blue theme.
  4. Homelab — infrastructure monitoring (infra-status, docker-containers, vm-status). Green/cyan theme.
  5. Creator — web development tools (sites, deploy, editor, workbench). Amber/violet theme.
  6. Media — full media suite (plex, rutorrent, audiobookshelf, tautulli). Pink/violet theme.

User-specific profiles (Bea, bogie Command, bogie Infrastructure, mauve) are stored as custom profiles in KV.

Custom Profiles & Grid Builder

Custom profiles are created and edited through a full-page grid builder at /admin/dashboard-profiles/edit/[id]. The builder provides:

  • 12-column drag-and-drop grid — powered by GridStack.js, widgets can be dragged to any position and resized by corner handles. The grid auto-packs items upward to avoid gaps.
  • Widget palette sidebar — checkboxes grouped by category (Infrastructure, Sites, Media, Tools). Checking adds the widget to the grid at its default size; unchecking removes it.
  • Theme picker — primary and secondary color pickers with a gradient preview bar.
  • Ctrl+S keyboard shortcut for quick saving.

When saved, the builder writes both a layout[] array (positioned grid data with x, y, w, h per widget) and a widgets[] array (flat list of IDs for backward compatibility) to KV at data:dashboard-profiles.

Layout Rendering

Profiles with layout data render on a 12-column CSS Grid with explicit grid-column and grid-row positions per widget. Category section headings are skipped — all widgets appear in a single flat grid matching the admin-designed layout.

Profiles without layout data (including all built-in profiles) render the original auto-fill CSS grid grouped by category sections (Infrastructure, Sites, Media, Tools). Each section gets a heading and widgets flow left-to-right in repeat(auto-fill, minmax(280px, 1fr)).

On mobile (under 768px), both modes collapse to a single-column layout.

Profile Switching

When a user has multiple profiles assigned, a tab-style switcher appears at the top of the dashboard next to the greeting. Clicking a tab filters to that profile’s widgets and theme. An “All” tab merges widgets from all assigned profiles. The active profile is tracked via the ?profile=id query parameter.

Profile Resolution

Profile resolution follows this priority chain:

  1. User’s dashboardProfiles[] — if the user record has profiles assigned, those are used
  2. Role default — admin→admin profile, member→member profile, demo→demo profile
  3. Fallback — member profile if nothing else matches

Multiple profiles are merged: widgets are unioned (deduplicated), and the first profile’s theme wins.

Federation & Service Registry

The dashboard integrates with the Service Registry and Federation system for multi-user, multi-network support. Service URLs are resolved per-user through the registry — each user sees only links to services they have access to. Five new inline widgets support the federation: quick-launch, grafana-embed, storage-overview, speedtest, and network-status. The full widget inventory (18 total) is documented in the Federation docs.

Technical Details

The dashboard page is an Astro page at src/pages/admin/index.astro that renders a React island for the interactive dashboard component. Authentication is checked server-side in the Astro middleware, redirecting unauthenticated requests to /login. The React component hydrates with client:load to ensure the command palette and notification system are immediately available.

API calls from the dashboard use the shared adminFetch utility that automatically attaches the session token and handles 401 responses by redirecting to login. All dashboard data is fetched client-side after mount to keep the initial page load fast, with skeleton loaders shown during data fetching.

admindashboardfeature-flagscommand-paletteprofilesgrid-builder