Production checklist¶
Use this checklist before shipping a LessonKit course to learners in an LMS, standalone site, or LRS-backed deployment.
Packaging target¶
Target |
|
xAPI transport |
|---|---|---|
SCORM / xAPI / cmi5 (LXPack iframe) |
|
Required if you report to an LRS |
Standalone web (no LMS parent) |
|
Required if you report to an LRS |
Verify the parent exposes window.parent.lxpackBridge.v1 in SCORM previews before go-live. If the bridge is missing, completions stay in the UI only.
xAPI and analytics¶
Configure a transport —
config.xapi.transportorconfig.xapi.client. Without it, statements queue in memory only.Flush on tab exit —
LessonkitProviderflushes onvisibilitychange(hidden) andpagehide. Custom clients must callflush()themselves.Monitor queue depth — use
config.observability.onXapiQueueDepthand handleonXapiQueueCapwhen the queue drops oldest statements (default cap: 1000).Never embed LRS secrets in the bundle — use short-lived tokens from your backend or LMS proxy; do not ship Basic auth passwords in client JavaScript.
Session and resume¶
Unique
blockIdon eachPage,InteractiveBook, andAssessmentSequencewhenpersistCompoundStateis enabled (defaulttrue).Kiosk / shared devices — set
config.session.persistCompoundState: falseor use private browsing. See Security.Expect multi-tab last-write-wins — same origin tabs share
sessionStoragekeys.
Observability (recommended)¶
observability: {
onTelemetrySinkError: (err, ctx) => reportError({ ...ctx, err }),
onXapiQueueDepth: (depth) => metrics.gauge("lessonkit.xapi.queue", depth),
onXapiQueueCap: () => metrics.increment("lessonkit.xapi.queue_cap"),
onLxpackBridgeMiss: (event) =>
reportWarning("lxpack_bridge_missing", { event: event.name }),
},
CI / build¶
Pin aligned
@lessonkit/*versions (framework 1.2.x).lessonkit buildandlessonkit packagerun under Node 18+; setLESSONKIT_CMD_TIMEOUT_MSif builds need a limit (default 30 minutes per subprocess).