learningequality / learningequality/studio
QTI Question Authoring in Kolibri Studio
@AlexVelezLl is already working on this.
Since Jun 30, 2026.
- Dominant language
- Python
- Stars
- 191
- Forks
- 307
- Avg merge
- 5d 6h
- Merged PRs (30d)
- 10
Description
❌ This issue is not open for contribution. Visit Contributing guidelines to learn about the contributing process and how to find suitable issues.
Overview
Content creators can author QTI 3.0 questions directly in Kolibri Studio, generating valid QTI packages that render correctly in Kolibri's learner-facing viewer.
Description and outcomes
This project adds QTI 3.0 question authoring to Kolibri Studio's existing exercise editor — the same interface content creators already use to build Multiple Choice and Text Entry questions. New interaction types will be available through the question type selector, extending the editor rather than replacing it.
When complete, content creators will be able to:
- Author all supported QTI 3.0 interaction types directly in Studio without external tools
- Configure correct answers and scoring rules for each question type
- Generate valid QTI 3.0 packages that can be transferred to Kolibri and rendered for learners
This project is one of two parallel GSoC efforts. See the ecosystem PRD for the full context, interaction type definitions, cross-cutting requirements, and the Studio→Kolibri contract that governs both projects.
Feature Requirements
The new interaction types fall into two categories with meaningfully different authoring experiences. Block-level interactions follow the existing editor pattern — question prompt above, answer inputs below. Passage-based interactions (Gap Match and Inline Choice) require authors to write a passage of text and insert interactive elements directly within it.
All interaction types must follow Kolibri Studio's existing content creation patterns and use Kolibri Design System components. See the ecosystem PRD for cross-cutting accessibility, RTL, and mobile requirements that apply to all types.
| Interaction Type | What the author configures | Notes |
|---|---|---|
| Single Choice | Question prompt; 2+ answer options; one correct answer | Prototyped — reference implementation exists |
| Multiple Choice | Question prompt; 2+ answer options; one or more correct answers | Prototyped — reference implementation exists |
| Text Entry | Question prompt; accepted correct answer text | Existing — used in survey modality today |
| Ordering | Question prompt; list of items in the correct order (learner sees them shuffled) | Proof-of-concept already built by GSoC contributor |
| Matching | Question prompt; two sets of items; correct pairings between them | — |
| Pair Matching | Question prompt; single pool of items; correct pairings within that pool | — |
| Gap Match | Passage text with gap placeholders inserted inline; pool of draggable tokens; correct token-to-gap mapping | Passage-based — requires richer authoring experience than block-level types |
| Inline Choice | Passage text with dropdown placeholders inserted inline; answer options per dropdown; correct answer per dropdown | Passage-based — architecturally more complex than block-level types |
Core Interactions
Note: Final UI spec will be provided by Learning Equality design staff. Screenshots below are from the WIP Figma spec and are subject to change.
| Description | Screenshot |
|---|---|
| Single Choice — Author selects "Single Choice" from the question type dropdown, enters a question prompt, and adds answer options with one marked as correct. | (add screenshot) |
| Multiple Choice — Same as Single Choice, but one or more answers can be marked correct. | (add screenshot) |
| Text Entry — Author enters a question prompt and the accepted correct answer text. | (add screenshot) |
| Ordering — Author enters a question prompt and adds items in the correct order. Learners will see them shuffled. | (add screenshot) |
| Matching — Author enters a question prompt, defines two sets of items, and marks the correct pairings between them. | (add screenshot) |
| Pair Matching — Author enters a question prompt, defines a single pool of items, and marks the correct pairings within that pool. | (add screenshot) |
| Gap Match — Author writes a passage of text, inserts gap placeholders inline, and defines a pool of draggable tokens with the correct token-to-gap mapping. | (add screenshot) |
| Inline Choice — Author writes a passage of text, inserts dropdown placeholders inline, and defines the answer options and correct answer for each dropdown. | (add screenshot) |
Response type answer requirements
| Interaction | Answer content |
|---|---|
| Choice | block |
| Order | block |
| Associate | block |
| Match | block |
| Gap match | inline (qti-gap-text; qti-gap-img is an image, not text) |
| Inline choice | plain text |
| Text entry | plain text (author supplies a correct-response string; no visible option content) |
| Toolbar group | Block (Choice/Order/Associate/Match) | Inline (Gap match text) | Plain text (Inline choice, Text entry) |
|---|---|---|---|
| History actions (undo, redo) | ✓ | ✓ | ✓ |
| Format dropdown (Normal, Small, H1, H2, H3) | ✓ | Small only | — |
| Text style (bold, italic, underline, strikethrough) | ✓ | ✓ | — |
| Copy & paste (copy, paste, paste w/o formatting, clear formatting) | ✓ | ✓ | copy / paste w/o formatting only |
| List formatting (bullet, numbered) | ✓ | — | — |
| Script formatting (sub, super) | ✓ | ✓ | — |
| Alignment (left, right) | ✓ | — | — |
| Insert image | ✓ | ✓ | — |
| Insert link | ✓ | ✓ | — |
| Math formula | ✓ | ✓ | — |
| Code block | ✓ | — | — |
Backend Requirements
For each new interaction type, Studio must generate valid QTI 3.0 XML that is compatible with Kolibri's QTI viewer and with other QTI-compliant platforms. This means extending the existing QTI serialization and packaging pipeline to support each type — the pipeline's architecture already supports this; each new type is an addition, not a redesign.
Validation must happen during editing, not only at publish time. Because Studio's publish process runs asynchronously, errors caught late are effectively invisible to content creators. Each interaction type must surface authoring errors to the creator before they reach the publish step.
The backend must integrate with Studio's existing content pipeline — how content is stored, synced, and transferred to Kolibri — without breaking existing question types or workflows.
Resources
- Ecosystem PRD: (link to ecosystem PRD once posted)
- Figma design spec (WIP): https://www.figma.com/design/B2IVU3zYih4iqhzDaWei73/QTI-work-2023?node-id=2028-12294
- Kolibri rendering issue: learningequality/kolibri#11428
- Gherkin scenarios: TBD
- QTI 3.0 specification: https://www.imsglobal.org/spec/qti/v3p0/impl
Accessibility Requirements
Accessibility requirements for all interaction types are defined in the ecosystem PRD and apply in full to this project. They are not optional and must be addressed during development, not after. All new authoring UI components must meet WCAG 2.1 Level AA standards, with particular attention to keyboard navigation, ARIA patterns, and screen reader support for the more complex interaction types (Matching, Gap Match, Inline Choice).
Out of Scope
- Learner preview in Studio — a Studio-side preview of authored questions is planned as a follow-on, built by porting Kolibri's renderer. It is not part of this project.
- Additional QTI interaction types — this project covers the nine interaction types defined in the ecosystem PRD. Other QTI 3.0 interaction types are not in scope and should not be treated as stretch goals. The goal is to do the defined set well.
- Variations on how QTI interaction types are rendered — this project intentionally limits the permutations for editor use (for example in multiple choice -- choosing numbers (1) (2) (3) vs. letters (A) (B) (C) for answer options). While the learner side will need to support these variations for QTI created outside of Studio, we are minimizing the number of options we are offering on the editor side.
- QTI package import — the ability to import existing QTI packages into Studio for editing is not in scope.
- Changes to the existing survey modality — the Text Entry / short answer survey workflow is not being modified as part of this project.
- Changes to the setup wizard or Perseus pipeline — this project extends the QTI path only and does not touch the Perseus generator or exercise routing beyond what is necessary to support the new types.
Acceptance Criteria
- All eight interaction types listed in the Feature Requirements table are fully authorable in Kolibri Studio, including question prompt, answer/response configuration, and correct answer definition
- Studio generates valid QTI 3.0 packages for each interaction type that render correctly in Kolibri's QTI viewer
- Authoring errors are surfaced to content creators during editing, not silently swallowed at publish time
- All new authoring UI components meet WCAG 2.1 Level AA standards, including keyboard navigation and screen reader support
- All interaction types function correctly in right-to-left language contexts
- All interaction types are fully usable on mobile viewports
- The new types integrate cleanly with Studio's existing content pipeline without breaking existing question types or workflows
- The semantic HTML structure and component patterns are consistent with the Kolibri-side implementation (see ecosystem PRD)
- Unit tests cover QTI XML generation for each interaction type
- Integration tests verify the end-to-end pipeline from Studio authoring to a valid QTI package
AI usage
This issue was drafted using assistance from Claude Code (Sonnet 4.6)
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.