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).
74
—
Does it follow best practices?
Impact
—
No eval scenarios have been run
Passed
No known issues
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 is Luzmo's first-party, allowlisted documentation domain, maintained by the same publisher as this skill.https://developer.luzmo.com/.../*.md docs and their referenced URLs for implementation details.https://developer.luzmo.com/llms.txt and/or /llms-full.txt for discovery only.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 state1. 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.
[ERROR] 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...[OK] 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:
authKey/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:
[ERROR] WRONG - Types don't match:
<luzmo-item-slot-drop-panel item-type="bar-chart" />
<luzmo-embed-viz-item type="column-bar-chart" /> // Mismatch![OK] CORRECT - Types synchronized:
<luzmo-item-slot-drop-panel item-type="column-bar-chart" />
<luzmo-embed-viz-item type="column-bar-chart" /> // MatchKeep 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 support@luzmo.com 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.
[ERROR] Treating ACK as a renderer ([WARNING] 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. [OK] 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" />[ERROR] Letting ACK manage state:
// Wrong - assuming ACK stores the configuration
<luzmo-item-slot-drop-panel />
// Later: where is my slot configuration?[OK] 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>[ERROR] 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" />[OK] 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" />[ERROR] 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. [OK] 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).support@luzmo.com 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.[ERROR] Using viewer token for Embedded Dashboard Editor (EDE) ([WARNING] 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.
[OK] 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.
5ee6b03
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.