12 KiB
Cerberus Rebrand & CrowdSec UX Simplification Plan
Intent
Rebrand the security surface from “Security” to “Cerberus,” streamline CrowdSec controls, and add export/preset affordances that keep novice users in flow while reducing duplicated toggles.
Phase 0 — Recon & Guardrails
- Inventory the navigation and overview copy in frontend/src/components/Layout.tsx and frontend/src/pages/Security.tsx to rename labels to “Cerberus” (keep route paths unchanged unless routing requires). Update tests that assert “Security” strings (e.g., frontend/src/components/tests/Layout.test.tsx, frontend/src/pages/tests/SystemSettings.test.tsx).
- Map CrowdSec UX touchpoints: overview card actions in frontend/src/pages/Security.tsx (toggle, start/stop, export), detail page flows in frontend/src/pages/CrowdSecConfig.tsx, and import-only view in frontend/src/pages/ImportCrowdSec.tsx. Note supporting hooks/api in frontend/src/hooks/useSecurity.ts, frontend/src/api/security.ts, and frontend/src/api/crowdsec.ts.
- Confirm copy/feature-flag alignment with Cerberus flag (
feature.cerberus.enabled) and ensure the header banner in frontend/src/pages/Security.tsx narrates the new name.
Phase 1 — Cerberus Naming & Navigation
- Sidebar: Rename “Security” group to “Cerberus” and child “Overview” to “Dashboard” in frontend/src/components/Layout.tsx; keep emoji or refresh iconography to match three-head guardian motif. Ensure mobile/desktop nav tests cover the renamed labels.
- Dashboard page: Retitle h1 and hero banner strings to “Cerberus Dashboard” (e.g.,
Cerberus Dashboard,Cerberus Disabled) in frontend/src/pages/Security.tsx. Update toast and overlay copy to keep the lore tone (“Three heads turn…” etc.) but mention Cerberus explicitly where it helps recognition. - Docs links: Verify the external link buttons still point to https://wikid82.github.io/charon/security; if a Cerberus-specific page exists, swap URLs accordingly.
Phase 2 — CrowdSec Controls (Overview Card)
- Remove redundant start/stop buttons when a master toggle exists. Convert the CrowdSec card action cluster in frontend/src/pages/Security.tsx to a single toggle that: (a) calls
startCrowdsec()when switching on, (b) callsstopCrowdsec()when switching off, (c) reflectsstatus.crowdsec.enabledandstatusCrowdsec()state. Keep Logs/Config/Export buttons. - Eliminate the local “enabled” switch and start/stop duplication so the UI shows one clear state. Disable controls when Cerberus is off.
- Keep export action but surface a naming prompt (see Phase 4) so downloads are intentional.
Phase 3 — CrowdSec Config Page Simplification
- Remove the “Mode” select block from frontend/src/pages/CrowdSecConfig.tsx; replace with a binary toggle or pill (“Disabled” vs “Local”) bound to
updateSetting('security.crowdsec.mode', ...)so users don’t see redundant enable/disable alongside the overview toggle. - Drop the “Mode” heading; elevate status microcopy near the toggle (“CrowdSec runs locally; disable to pause decisions”).
- Keep ban/unban workflows and file editor intact; ensure decision queries are gated on mode !== disabled after refactor.
Phase 4 — Import/Export Experience
- Rename “Import Configuration” section in frontend/src/pages/CrowdSecConfig.tsx to “Configuration Packages” with side-by-side Import and Export controls. (Recommended canonical section name: Configuration Packages.)
- Add export capability on the config page (currently only on overview) using
exportCrowdsecConfig()with a filename prompt that proposes a default from a lightweight “Planning agent” helper (stub: derivecrowdsec-export-${new Date().toISOString()}.tar.gz, allow override before download). Reuse the same helper in the overview card export to keep naming consistent. - Update frontend/src/pages/ImportCrowdSec.tsx to reuse the shared import/export helper UI if feasible, or clearly label it as a tasks-only entry point. Ensure backup creation messaging stays intact.
Phase 5 — Presets for CrowdSec
- Introduce a presets catalog file (e.g., frontend/src/data/crowdsecPresets.ts) mirroring the style of frontend/src/data/securityPresets.ts, with curated baseline parsers/collections (e.g., “Honeypot Friendly Defaults”, “Bot Mitigation Essentials”, “Geolocation Aware”).
- Surface preset chooser in frontend/src/pages/CrowdSecConfig.tsx above file editor: selecting a preset should prefill a preview and require explicit “Apply” to write via
writeCrowdsecFile()(withcreateBackup()first). Add small-print warnings for aggressive presets. - Consider quick chips for “Local only” vs “Community decisions” if backend supports; otherwise, hide or disable with tooltip.
Research: CrowdSec Hub / Presets (summary & recommended approach)
-
Official Hub: CrowdSec maintains a canonical Hub repository for parsers, scenarios, collections, and blockers at https://github.com/crowdsecurity/hub and an online Hub UI (https://hub.crowdsec.net/ or https://app.crowdsec.net/hub/). This is the same repo used as
csclisource-of-truth. -
Distribution Methods & UX:
cscliCLI: operators typically usecscli hub pullto fetch items from the Hub; Charon currently callscsclifor decisions/listing in the backend viaCommandExecutor.- Index / API: the Hub publishes an index (e.g.,
.index.json) and the repo can be parsed to list available presets; the Hub UI uses this index. - Single-file or tarball packages: Hub items are directories that can be packaged and applied to a CrowdSec runtime.
-
Integration options for Charon (recommended):
- Curated Presets (default): Ship a small set of curated presets with Charon (frontend
crowdsecPresets.ts, backendcharon_presets.go). This is the safest, offline-first, and support-friendly route. - Live Hub Sync (optional advanced): Provide an admin-only backend endpoint to pull from the official Hub or via
cscli. Cache and validate fetched presets; admin must explicitly Apply. - Hybrid: Default to curated shipped presets with opt-in live sync that fetches additional or replacement presets from the Hub.
- Curated Presets (default): Ship a small set of curated presets with Charon (frontend
-
Security & UX: validate remote presets before applying, create backups, and track origin/etag for auditability. If fetching from Hub, prefer a
pullendpoint that runs in a server-side sanitized environment and returns a preview; require explicitapplyto change the active config.
Implementation Recommendations (High-level file/function list)
Frontend files & functions (UI changes):
frontend/src/components/Layout.tsx— rename navSecuritytoCerberusandOverviewtoDashboard.frontend/src/pages/Security.tsx— change header toCerberus Dashboardand update hero/help copy to reference Cerberus. Update labelSecurity Suite DisabledtoCerberus Disabledand UI textEnable Cerberuswhere applicable.frontend/src/pages/CrowdSecConfig.tsx— replace theModeselect with a binary toggle (or pill) and renameImport ConfigurationtoConfiguration Packagesfor the import/export section. AddPresetChoosercomponent to preview and apply presets.frontend/src/pages/ImportCrowdSec.tsx— update copy toConfiguration Packagesif the import page is still used.frontend/src/data/crowdsecPresets.ts— add curated default presets for Charon.frontend/src/hooks/useCrowdsecPresets.ts— new hook for presets queries/mutations (useQueryforgetCrowdsecPresets,useMutationfor pull/apply).frontend/src/api/presets.ts— typed API client functions:getCrowdsecPresets,pullCrowdsecPreset,applyCrowdsecPreset.
Back-end files & functions (API & runtime behavior):
backend/internal/api/handlers/crowdsec_handler.go— extend or add routes:GET /admin/crowdsec/presets,POST /admin/crowdsec/presets/pull,POST /admin/crowdsec/presets/apply,POST /admin/crowdsec/presets/importto mirror existing import flow.backend/internal/crowdsec/hub.go— new backend helper to fetchindex.jsonfrom Hub, download tarball, and validate (withhublint/cshubif available). Expose aFetchPresetfunction to return atar.gzblob or parsed files for preview.backend/internal/crowdsec/presets.go— curated presets and caching/validation.backend/internal/api/handlers/crowdsec_exec.go— consider exposing aExecuteCscli()helper wrapper for securecscliusage if the backend runs on the same host wherecscliis installed (current code provides an executor abstraction already; reuse it for hub operations).
Unit test updates (explicit suggestions)
frontend/src/components/__tests__/Layout.test.tsx— assertCerberusandDashboarddisplay labels and preserve route paths. Add test for collapsed/expanded state showing the new Dashboard name.frontend/src/pages/__tests__/Security.test.tsx— update expectations forCerberus Dashboardand hero copyCerberus Disabledwhenfeature.cerberus.enabledis false.frontend/src/pages/__tests__/CrowdSecConfig.test.tsx— remove assertions forModeselect (or replace with binary toggle tests) and add tests forPresetChooserinteractions: preview, pull, and apply. Add tests forConfiguration Packagesheader presence.frontend/src/pages/__tests__/ImportCrowdSec.test.tsx— update to assertConfiguration Packagesand to reuse import/export helper test cases.backend/internal/api/handlers/crowdsec_handler_coverage_test.go— add tests for the newpresetsendpoints:GET /admin/crowdsec/presetsandPOST /admin/crowdsec/presets/pullwith mocked hub fetch and error conditions.
Live Hub vs Curated Presets (decision note)
- Charon's default should be curated presets shipped with the app for stability and easier support.
- Provide optional Live Hub Sync as an opt-in admin feature. Live Hub Sync should:
- Fetch a list from the Hub index and display a preview in UI
- Validate content and run a
trailingorlinterbefore presenting an operator with a safe apply - Cache fetched presets server-side and only apply them when the admin clicks "Apply" (with automatic pre-apply backup)
- Allow rollback via stored backups
Phase 6 — Testing & Copy Polish
- Update unit/UI tests that assert strings or button counts in frontend/src/components/tests/Layout.test.tsx, frontend/src/pages/tests/SystemSettings.test.tsx, and any CrowdSec page tests to reflect renamed labels and removed start/stop buttons.
- Add targeted tests for the new export naming prompt and the toggle-driven start/stop behavior (mock
startCrowdsec/stopCrowdsecin frontend/src/api/crowdsec.ts). - Light copy edit to keep “Cerberus” consistent and reassure users when controls are disabled by global flag.
Phase 7 — Docs & Housekeeping
- Update docs/features.md and docs/security.md with Cerberus naming and simplified CrowdSec flows; include screenshots after UI update.
- No
.gitignore,.dockerignore,.codecov.yml, orDockerfilechanges needed based on current scope (new files stay under trackedfrontend/src/dataand existing build ignores already cover docs/plan artifacts). Re-evaluate if new binary assets or build args appear.
Success Criteria
- Sidebar, overview headings, and toasts consistently say “Cerberus.”
- CrowdSec overview shows one toggle-driven control with non-conflicting actions; config page has no standalone Mode select.
- Import/Export flows include a user-visible filename choice; presets available and gated by backup + apply flow.
- Tests and docs updated; builds and lint/tests green via existing tasks.