From Luzmo Agent Skills
Build a self-service analytics environment inside your application. Two approaches - out-of-the-box Embedded Dashboard Editor (editMode) or custom Analytics Components Kit (ACK). Use for letting end-users create/edit dashboards, white-label studios, editMode, designer/owner token roles, and ACK configuration. Triggers on: "self-service analytics", "let users edit dashboards", "embedded studio", "analytics components kit", "ACK", "designer role", "dashboard editor". Critical pattern: ACK configures -> your app stores state -> separate renderer displays. Not for view-only embedding of saved dashboards (use core), building charts in code (use data-visualization), data connection (use data-integration), or AI queries (use ai-analytics).
How this skill is triggered — by the user, by Claude, or both
Slash command
/luzmo-agent-skills:analytics-studioThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Entry-point for building a **self-service analytics environment** inside embedded applications — where end-users can create, edit, or build their own dashboards and charts.
Entry-point for building a self-service analytics environment inside embedded applications — where end-users can create, edit, or build their own dashboards and charts.
Two approaches:
editMode on the dashboard component (fastest path)Also covers programmatic dashboard construction via API (Path C).
developer.luzmo.com/*.md page(s) before coding.https://developer.luzmo.com/llms.txt / https://developer.luzmo.com/llms-full.txt only to discover pages, not as the final source.The fundamental mental model: ACK follows a ONE-WAY data flow pattern. Understanding this is essential before building ANY custom analytics UI.
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ ACK Components │ ---> │ Your Application │ ---> │ Luzmo Rendering │
│ (Configure) │ │ (Store State) │ │ (Display Chart)│
└─────────────────┘ └──────────────────┘ └─────────────────┘
Emit events Own the state Receives state
1. Configure (ACK Components)
2. Store (Your Application)
slotsContents, options, filters3. Render (Luzmo Embed Components)
<luzmo-embed-viz-item> (single chart) or <luzmo-item-grid> (multi-chart)Critical misunderstanding: "ACK components will render the chart"
Reality: Individual ACK configuration components only produce configuration. Your app stores it. Exception: <luzmo-item-grid> provides built-in rendering for multi-chart layouts.
❌ WRONG - This won't display anything:
// ACK components don't render - they just configure!
<luzmo-item-slot-drop-panel item-type="bar-chart" />
// Nothing visible on screen...
✅ CORRECT - ACK configures, app stores, separate component renders:
// React example
// 1. ACK configures (emits events)
<luzmo-item-slot-drop-panel
item-type="bar-chart"
onSlotChange={(e) => setSlotsContents(e.detail)} />
// 2. Your app stores state
const [slotsContents, setSlotsContents] = useState({...})
// 3. Separate rendering component displays
<luzmo-embed-viz-item
type="bar-chart"
slotsContents={slotsContents} />
BEFORE implementing ACK:
role: "designer" or "owner"role: "viewer") CANNOT use ACKauthKey/authToken (or auth-key/auth-token in HTML)If ANY checkbox is unchecked, STOP - viewer tokens cannot activate edit mode or drive ACK components, and ACK data-fetching components require embed tokens.
For full auth/embed-token guidance, see core.
ACK item-type MUST match rendering component type:
❌ WRONG - Types don't match:
<luzmo-item-slot-drop-panel item-type="bar-chart" />
<luzmo-embed-viz-item type="column-bar-chart" /> // Mismatch!
✅ CORRECT - Types synchronized:
<luzmo-item-slot-drop-panel item-type="column-bar-chart" />
<luzmo-embed-viz-item type="column-bar-chart" /> // Match
Keep these in sync:
item-type ↔ Rendering component typeEssential utilities:
loadDataFieldsForDatasets - Fetch component-ready dataset fields before rendering ACK data pickersswitchItem - Remap existing slot configuration when user changes chart typeExample flow:
import { switchItem, loadDataFieldsForDatasets } from '@luzmo/analytics-components-kit/utils';
// User selects new chart type
async function handleChartTypeChange(newType) {
// 1. Update ACK item-type
setAckItemType(newType)
// 2. Remap existing slots for new chart type
const next = await switchItem({
oldItemType: currentType,
newItemType: newType,
slots: currentSlots,
options: currentOptions
})
// 3. Update state
setChartType(next.type)
setSlots(next.slots)
setOptions(next.options || {})
// 4. Rendering component automatically updates via state
}
Important: ACK requires the "Analytics Components Kit" addon in your Luzmo license.
Common license errors:
Without this addon, ACK components will not function.
Choose the right approach for your use case:
| What You're Building | Use This |
|---|---|
| View-only dashboard | Dashboard embedding (core skill) |
| Quick out-of-the-box editor | Embedded Dashboard Editor with editMode |
| Fully custom configuration UI | ACK (this skill) |
| Code-first single chart | Flex (data-visualization skill) |
| White-label analytics studio | ACK (this skill) |
Decision guide:
editMode on dashboard component| Goal | Path |
|---|---|
| Give end-users a full out-of-the-box editor quickly | Path A — Embedded Dashboard Editor |
| Build a branded, component-by-component configuration UI | Path B — Analytics Components Kit (ACK) |
| Programmatically create or modify dashboards via API | Path C — Dashboard API |
Read only the reference file for the chosen path.
references/embedded-editor.mdreferences/dashboard-api.mdWhen building with ACK (Path B), these are the key components available:
| User need | Component | Doc |
|---|---|---|
| Browse/drag dataset fields | luzmo-data-field-panel | https://developer.luzmo.com/guide/ack--components--data-fields.md |
| Assign fields (drag) | luzmo-item-slot-drop-panel | https://developer.luzmo.com/guide/ack--components--data-slots.md |
| Assign fields (dropdown) | luzmo-item-slot-picker-panel | https://developer.luzmo.com/guide/ack--components--data-picker--luzmo-item-slot-picker-panel.md |
| Chart appearance options | luzmo-item-option-panel | https://developer.luzmo.com/guide/ack--components--item-options.md |
| Add/edit filters | luzmo-filters | https://developer.luzmo.com/guide/ack--components--filters--luzmo-filters.md |
| Render one chart | luzmo-embed-viz-item | https://developer.luzmo.com/guide/ack--components--chart-rendering--luzmo-embed-viz-item.md |
| Multi-chart grid (renders) | luzmo-item-grid | https://developer.luzmo.com/guide/ack--components--chart-rendering--luzmo-item-grid.md |
Full component documentation: references/embedded-editor.md
<luzmo-embed-viz-item> or <luzmo-item-grid>). Exception: <luzmo-item-grid> is an ACK component that provides built-in rendering for multi-chart layouts.slotsContents, options, filters.item-type and rendering component type synchronized.contents is always fully replaced on update — retrieve first, then patch, then send.title, label, etc.) must be localized objects: { "en": "..." }.core/references/local-development-proxy.md: set apiHost to the app origin and keep appServer pointed directly at the Luzmo app host. In production, contact [email protected] to arrange CNAMEs when custom domains are needed. EU and US base URLs cannot be mixed.Each pitfall below includes a frequency marker, the symptom you'll see, why it fails, and the fix.
❌ Treating ACK as a renderer (⚠️ VERY COMMON — the #1 ACK failure):
<!-- Wrong - no chart will appear -->
<luzmo-item-slot-drop-panel item-type="bar-chart" />
You'll see: ACK UI renders, user can drop fields, no chart ever appears, no error in console. Why this fails: ACK components produce configuration STATE — they do not render charts. The configured state must be captured by your app and passed into a separate Embed rendering component. ✅ Always pair ACK with rendering component:
<!-- Correct - ACK configures, Flex renders -->
<luzmo-item-slot-drop-panel item-type="bar-chart" />
<luzmo-embed-viz-item type="bar-chart" :slots="slots" />
❌ Letting ACK manage state:
// Wrong - assuming ACK stores the configuration
<luzmo-item-slot-drop-panel />
// Later: where is my slot configuration?
✅ Your app owns and stores the state:
<!-- Vue example -->
<!-- Correct - capture and store in your app -->
<script>
const slots = ref([])
</script>
<template>
<luzmo-item-slot-drop-panel
@slot-change="(e) => slots = e.detail.slots"
/>
</template>
❌ Mismatched item-type and rendering type:
<!-- Wrong - ACK configured as bar, but rendering line -->
<luzmo-item-slot-drop-panel item-type="bar-chart" />
<luzmo-embed-viz-item type="line-chart" :slots="slots" />
✅ Keep types synchronized:
<!-- Correct - both use same chart type -->
<luzmo-item-slot-drop-panel item-type="bar-chart" />
<luzmo-embed-viz-item type="bar-chart" :slots="slots" />
❌ CORS errors because API/realtime requests are cross-origin from the app:
You'll see: dashboard or chart fails to load, browser console shows CORS errors even though region URLs look correct. Why this fails: Flex, web component dashboards, and IQ-rendered charts open browser requests to the Luzmo API/realtime host. If those requests are not same-origin or configured for the app domain, the browser blocks them. ✅ Solutions:
core/references/local-development-proxy.md, set apiHost to the local app origin, and keep appServer direct (https://app.luzmo.com, https://app.us.luzmo.com, or VPC app host).[email protected] to set up CNAMEs when custom domains are needed. EU and US have different base URLs; never mix them.appServer under a sub-path; Flex/dashboard bundles load from appServer.❌ Using viewer token for Embedded Dashboard Editor (EDE) (⚠️ COMMON):
// Wrong - viewer cannot use EDE
const token = await client.create('authorization', {
type: 'embed',
role: 'viewer', // cannot use EDE
})
You'll see: 403 Forbidden when the dashboard component tries to load the editor UI (EDE) when the token has role: 'viewer'. This is not enforced for custom editor experiences built with ACK components.
Why this fails: EDE requires the editing-capable roles designer or owner. Viewer is intentionally restricted to read-only.
✅ Use designer or owner role:
// Correct - designer can use EDE
const token = await client.create('authorization', {
type: 'embed',
role: 'designer', // can use EDE
})
For deeper, focused guidance on specific paths:
references/embedded-editor.md — Path A (Embedded Dashboard Editor with editMode) and Path B (Analytics Components Kit). Includes ACK installation, component API references, state management patterns, and the configure→store→render workflow.references/dashboard-api.md — Path C (Dashboard API for programmatic dashboard creation/modification). Covers dashboard contents structure, view/screenmode configuration, and CRUD recipes for charts and filters.core for read-only dashboard display.When to escalate to other skills:
corecoremultitenancy (SECURITY CRITICAL — tenant filters must be enforced server-side)themingdata-integrationai-analyticsresource-managementtroubleshooting FIRSTThis skill does NOT cover:
core)core)data-integration)https://developer.luzmo.com/llms.txt, https://developer.luzmo.com/llms-full.txthttps://developer.luzmo.com/api/{action}{Resource}.mdhttps://developer.luzmo.com/guide/*.mdhttps://developer.luzmo.com/flex/charts/{type}.mdIf content exists on developer.luzmo.com, link — do not duplicate specs here.
npx claudepluginhub luzmo-official/agent-skills --plugin luzmo-agent-skillsProvides CDSS development patterns for drug interaction checking, dose validation, clinical scoring (NEWS2, qSOFA), and alert classification integrated into EMR workflows.