Delivery: the web target
On this page
A module for a plain web server, without an LMS (docs/decisions.md D41): the course shown on a site, a review link, a publication on Elabora’s servers. Hosting itself is not in the core.
Build
elabora build . --target web writes, next to the SCORM packages:
dist/<id>-<version>-web/ the folder to serve, as it is
dist/<id>-<version>-web.zip the same files, deterministic (D8)
dist/<id>-<version>-web.report.json the build report: target "web", web { progress, navigation, noindex, url, image }
dist/<id>-<version>-web.proof.md the proof dossier, with « Diffusion web »
The folder holds index.html, elabora/ (player, compiled course, theme), assets/, objects/ and, with --image, share.png|jpg|webp. No imsmanifest.xml; no LMS profile applies (--profile is refused).
| Setting | Values | Default |
|---|---|---|
--progress |
local: the lesson location, status, score and suspend data in the browser’s localStorage (elabora:web:<course id>), resumed at the next visit, across updates (the permanent keys of D4), and forgotten a year after the last visit; none: nothing kept anywhere, a reload starts again |
local |
--navigation |
authored: the course’s navigation rules and locks; free: every screen open from the outline and Next, nothing to complete, hear or visit first, narrations seekable |
authored |
--noindex |
<meta name="robots" content="noindex"> |
indexable |
--url <address> |
the absolute address of the module (https://…/): canonical link, og:url, the sharing image’s address |
none |
--image <file> |
PNG, JPEG or WebP shown when the link is shared (1200×630 reads well everywhere): og:image, twitter:card summary_large_image |
none |
--review-origin <origin> |
repeatable: a module for the Revue, shown in an iframe by a page of that origin (https://revue.elabora.studio; http://localhost:<port> for development). It carries the review bridge, elabora/review.js, and speaks elabora-review/1 with that page only (review-bridge.md, D42); its defaults become --progress none --navigation free --noindex |
none: no bridge, the module unchanged |
The page’s title is the course title, its description the course description (course.json). The course has no thumbnail of its own: give one with --image (an image of the course’s assets/, or the app’s project thumbnail).
MCP: elabora_build { target: "web", web: { progress, navigation, noindex, url, image, review: { origins } } } (image relative to the course folder). Engine: the build request takes target and web, and returns dir beside zip.
Recipes
- A showcase (the marketing site: a visitor goes where they like, nothing is kept):
elabora build . --target web --progress none --navigation free --url https://elabora.studio/vitrine/<id>/ --image assets/images/cover.jpg - A publication (learners on the web, resuming where they left, the course as designed):
elabora build . --target web --url https://<host>/<id>/ --image assets/images/cover.jpg(add--releasefor a client delivery: the plan must be approved) - A private link (a review before the review tools):
elabora build . --target web --navigation free --noindex - A link for the Revue (reviewers comment in revue.elabora.studio, which shows the module in an iframe):
elabora build . --target web --review-origin https://revue.elabora.studio(add--review-origin http://localhost:5173while the page is developed). Serve it withContent-Security-Policy: frame-ancestors https://revue.elabora.studioso no other site frames it.
Then serve the folder over HTTPS, open the address, reload, and check the sharing preview (the pending gate of the proof dossier).
Runtime
- The player never looks for an LMS in a module for the web, and shows neither the preview’s banner nor Quit. An event’s
exitaction still ends the visit, with a message of the web’s own: the progress is kept in this browser (local, labelwebEndedKept), or nothing is kept (none,webEndedNotKept). - Commits are those of a SCORM package (after each change, on
visibilitychange: hidden, onpagehide, everyheartbeatSeconds); withlocaleach writes the kept elements tolocalStorage, dated (savedAt). A progress saved more than a year ago is removed when the module opens, and the visit starts afresh. A refused or full storage keeps the visit’s progress in memory, never an error. nonewrites nothing: nolocalStorage, nosessionStorage(the narration’s preferences included), no cookie.- With
localthe learner is told where the progress is, and may clear it: the outline ends with « Votre progression reste dans ce navigateur. » and « Effacer ma progression » (also on the page anexitleaves), which asks once, then removeselabora:web:<course id>and starts the module again (labelsprogressKept,clearProgress,clearProgressConfirm,clearProgressYes,cancel; D41).
What the host must give
- One origin per publisher at least.
localStorageis per origin: two courses with the same id on one origin share their progress, and a course’s pages can read another’s storage. - An origin that changes hands must start empty. Whoever serves the module next at the same address runs their scripts on the same origin and could read what learners’ browsers kept. Elabora’s hosting clears the origin’s storage in the browser (
Clear-Site-Data) for a new owner of a handle, and a year after a learner’s last visit (elabora-cloud C33). - HTTPS, the folder served as it is (relative paths),
index.htmlfor the folder’s address. - For a whole publication out of search engines,
X-Robots-Tag: noindexon every file: the free objects’ frames are pages of their own, without the meta tag.