Skip to content

LC-JSON 1.0-rc.3

Pre-release
Pre-release

Choose a tag to compare

@bantonym bantonym released this 13 Jun 17:05
Immutable release. Only release title and notes can be modified.
v1.0-rc.3
306b974

LC-JSON (Learning Content JSON) is an open, Apache-2.0 format for structured learning content — full courses and standalone question sets — that any authoring tool, LMS, or validator can implement to read and write.

LC-JSON v1.0-rc.3 is the second publicly announced release candidate, and the last planned candidate before the 1.0 final release (targeted 2026-06-30). It is backwards-compatible with rc.2: every rc.2-valid document remains valid under rc.3. The earlier /1.0-rc.1/ and /1.0-rc.2/ schema sets stay served and frozen at their own URLs; rc.3 publishes at /1.0-rc.3/.

If you adopted rc.2, the move to rc.3 is low-cost: re-point your $schema URLs to /1.0-rc.3/ when convenient (or stay on rc.2 — it remains valid forever). The planned transition from rc.3 to 1.0 final is a pure URL rebase with no wire-format change.

Comment window: feedback is welcome through 2026-06-27. 1.0 final is planned for 2026-06-30 as a URL rebase of rc.3 — unless substantive feedback arrives that warrants a wire change, in which case it lands in a further candidate first. That date was announced with rc.2 on 2026-05-30 and has not moved.

What's new since rc.2

A localization and language model — LOCALIZATION.md. The specification now states explicitly how it represents language, separating three things that the single word "language" had been conflating:

  • language — the document's one delivery language (LC-JSON 1.x is single-language-per-document; translations are separate documents, not localized field bundles).
  • lang / dir on HTMLlanguage of parts: spans in a different language, for correct rendering and pronunciation (WCAG 3.1.2). Not translation.
  • supportLanguage — an optional pedagogical layer naming the learner's first language, for second-language teaching content.

Language tags are BCP 47: a bare ISO 639-1 code (en, es) is the common case, and region/script subtags (pt-BR, zh-Hant) are permitted — a consumer may act on only the primary subtag if it has no region-specific behavior.

The document also includes a short, candid note for implementers on screen-reader pronunciation: emitting lang is necessary but not sufficient for a span to be pronounced correctly — automatic language switching and installed voices vary across screen readers and live in the user's environment, outside the format's control. The format's job is to carry the affordance faithfully; lang is the floor, not optional.

A bigger conformance corpus. 64 cases (up from 38): a valid + invalid set for every implemented question type, a grading-combination matrix, referential-integrity cases, and document-wide globalId-uniqueness — now made explicit and enforced.

A clearer accessibility bargain. Two layers, stated plainly. Base conformance is preservation only: never strip alt, captions, <track>, lang/dir, or language metadata on read/write — and a small producer is never required to author them. The heavier bar — alt on every image, captions and transcripts on instructional speech-bearing video, transcripts on audio — is bound by the opt-in Accessibility Profile, for products (typically institutional, or with accessibility commitments) that claim it. Accessibility information is never silently dropped; the demanding part is opt-in.

One schema change (the reason rc.3 exists as a new immutable publication rather than an edit to rc.2): the prototype-era allowedFillerWords and prohibitExtraWordsBetweenChunks fields are removed from sentence-transformation.schema.json. They were optional and unused; documents carrying those optional fields still validate (consumers may ignore them, and producers should stop emitting them). Because a published /1.0-rc.2/ URL is immutable, this correction lands at /1.0-rc.3/.

Stable vs. still-moving

Stable — build against it now: the wire format, all 23 schemas, the two artifact types, the 12 implemented question types, the HTML safety profile, the accessibility profile, and the localization model. Schema URLs at /1.0-rc.3/ are immutable.

Try it

git clone https://github.com/lc-json/specification
cd specification
python tools/run_corpus.py        # 64/64 fixtures behave as expected
python tools/validate_course.py --course-path examples/course-minimal.json --strict

Feedback and issues: https://github.com/lc-json/specification/issues (bug-report and spec-change-proposal templates are provided).