[P0] Onboarding & empty state experience #101
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Parent Epic
#100
Problem
When a new team deploys Cameleer3 and opens the UI with zero agents connected, they see empty tables with no guidance. The first-run experience is where 80% of trial users are lost. Competing tools (Datadog, Grafana Cloud) nail guided setup — Cameleer currently has nothing.
Current State
Proposed Solution
1. Welcome / Getting Started Screen
When no agents are connected, replace the main content area with a guided onboarding flow:
2. Empty States Per Page
Each page should have contextual empty states instead of blank tables:
Exchanges tab (empty):
Dashboard tab (empty):
Runtime tab (empty):
3. Bootstrap Token Display
The admin should be able to view/copy the bootstrap token from the Admin area (or it should be shown during initial setup). Currently there's no way to get this token from the UI.
4. Demo Mode (stretch)
A "demo mode" toggle that loads synthetic sample data so prospects can explore the UI before connecting their own applications. This is common in SaaS products and dramatically improves time-to-value perception.
Design Considerations
EmptyStatecomponentAcceptance Criteria
References
Design Specification
1. First-Run Detection Logic
The UI determines onboarding state using existing hooks — no new backend endpoint needed for detection.
Phase transitions:
localStorage key:
cameleer-onboarding-dismissed = "true" | absent2. Welcome Screen Layout
Replaces the main content area when
phase === 'welcome'. Sidebar, top bar, tabs remain visible but empty.Dynamic content:
server-urlauto-populated fromwindow.location.origin(orconfig.apiBaseUrlin dev)bootstrap-tokenfetched from new admin endpoint, masked by defaultSnippet matrix:
cameleer3-spring-boot-starterin XMLapplication.ymlimplementation '...:cameleer3-spring-boot-starter:...'application.ymlcameleer3-quarkusin XMLapplication.propertiesimplementation '...:cameleer3-quarkus:...'application.propertiescameleer3-agentin XMLCameleerAgent.builder()...)implementation '...:cameleer3-agent:...'3. Bootstrap Token Management
New backend endpoint:
Response 200:
{ "token": "...", "hasRotationToken": true/false }Response 403: Non-admin users
Token display in onboarding:
your-bootstrap-tokenwith note: "Ask your administrator for the bootstrap token."Token display in Admin > App Config (new section at top):
4. Per-Page Empty States
All use the design system
EmptyStatecomponent.Exchanges (no exchanges):
Workflow48pxDashboard (no metrics):
BarChart348pxRuntime (no agents):
Radio48pxSidebar (no apps):
var(--text-muted))5. Agent Connection Detection
Uses existing polling (no new SSE needed):
useAgents()polls every 10suseRouteCatalog()polls every 15sStep 2 transitions:
Waiting → Connected:
Connected → Receiving:
Receiving → Complete (auto after 10s):
6. Setup Progress Banner
Thin banner between ContentTabs and
<main>in LayoutShell:Three banner states:
Collapse animation:
max-height: 44px → 0with 200ms ease-out.7. Dismissal & Return
Dismissal methods:
receivingphaseRe-access: "Setup Guide" item added to user dropdown menu in TopBar. Calls
reset()(clears localStorage) and navigates to/exchanges. Always visible — useful for onboarding additional applications.8. Component Mapping
CardCodeBlockcopyableprop)ButtonButtonGroupBadgeEmptyStateStatusDotMonoTextuseToastCSS variables only — no hardcoded colors.
9. File Structure
New files:
Modified files:
10. Edge Cases
connected(counts all agents regardless of status)getServerUrl()usesconfig.apiBaseUrlstripped of/api/v1suffix