Documentation
Dokumentation
Quiz exchange format
Austauschformat für Quizze
QuizLane imports and exports quizzes as ZIP files containing quizlane.json plus media files – or as a simple CSV table you can edit in Excel, Numbers or Google Sheets.
QuizLane importiert und exportiert Quizze als ZIP-Datei mit quizlane.json und Mediendateien – oder als einfache CSV-Tabelle, die du in Excel, Numbers oder Google Tabellen bearbeiten kannst.
1. ZIP package
1. ZIP-Paket
- The ZIP contains exactly one
quizlane.json in its root and optionally media files.
- Questions refer to media by relative paths, usually
media/<sha256>.<ext> (content-addressed, so the same file is stored only once). Any other relative path such as media/pike.jpg works as well.
- Images:
jpg, jpeg, png, webp, gif (max. 15 MB). Videos: mp4, m4v, mov (max. 200 MB). The file type is checked by its content, not only by its name.
- Text-only quizzes need no media – a ZIP with just
quizlane.json is fine.
- A quiz refers to its knowledge modules instead of containing questions directly. Modules with the same ID are recognised on import and not created twice.
- Empty values (null, empty texts and lists) are omitted on export. Unknown fields are ignored.
- Das ZIP enthält genau eine
quizlane.json im Wurzelverzeichnis und bei Bedarf Mediendateien.
- Fragen verweisen über relative Pfade auf Medien, im Normalfall
media/<sha256>.<endung> (inhaltsadressiert – dieselbe Datei liegt nur einmal vor). Andere relative Pfade wie media/hecht.jpg funktionieren ebenso.
- Bilder:
jpg, jpeg, png, webp, gif (max. 15 MB). Videos: mp4, m4v, mov (max. 200 MB). Das Format wird am Inhalt geprüft, nicht nur am Namen.
- Reine Text-Quizze brauchen keine Medien – ein ZIP nur mit
quizlane.json genügt.
- Ein Quiz verweist auf seine Wissensbausteine, statt die Fragen direkt zu enthalten. Bausteine mit gleicher Kennung werden beim Import erkannt und nicht doppelt angelegt.
- Leere Werte (null, leere Texte und Listen) werden beim Export weggelassen. Unbekannte Felder werden ignoriert.
2. quizlane.json
2. quizlane.json
| Field | Type | MeaningBedeutung |
format | text | "quizlane" |
formatVersion | number | Currently 1. Older versions are upgraded, newer ones rejected.Aktuell 1. Ältere Versionen werden hochgestuft, neuere abgelehnt. |
quiz | Quiz | The quiz (required).Das Quiz (Pflicht). |
modules | [Module] | All modules the quiz uses, delivered in full.Alle Bausteine des Quiz, vollständig mitgeliefert. |
Quiz
| Field | Type | MeaningBedeutung |
id | text | Permanent unique ID (required), e.g. a UUID.Dauerhafte eindeutige Kennung (Pflicht), z. B. eine UUID. |
version | number | Published version (default 1).Veröffentlichte Version (Standard 1). |
title, description | text | Title (required for publishing) and description.Titel (für die Veröffentlichung Pflicht) und Beschreibung. |
language | text | Source language as BCP 47 code, e.g. de, en (default en).Ausgangssprache als BCP-47-Kürzel, z. B. de, en (Standard en). |
languages | [text] | Further content languages with translations.Weitere Inhaltssprachen mit Übersetzungen. |
titleI18n, descriptionI18n | {lang: text} | Translations of title and description.Übersetzungen von Titel und Beschreibung. |
cover | text | Path of the cover image.Pfad des Titelbilds. |
categories, tags | [text] | For classification and search – not content.Zur Einordnung und Suche – keine Inhalte. |
modules | [ModuleRef] | Modules in order: {id, version?}. If empty, all supplied modules are used.Bausteine in Reihenfolge: {id, version?}. Leer = alle mitgelieferten Bausteine. |
catalogSearch | bool | Offer a search field for large answer catalogues (default true).Suchfeld bei großen Antwortkatalogen anbieten (Standard true). |
path | LearningPath | {type: adaptive|sequence|chapters|random, unlockShare?} – default adaptive; unlockShare (default 0.8) = share of mastered questions that unlocks dependent chapters.Standard adaptive; unlockShare (Standard 0,8) = Anteil beherrschter Fragen, der aufbauende Kapitel freischaltet. |
exam | ExamConfig | {rules: [{moduleId, count, minCorrect?, chapterIds?}], passPercent?, minutes?} – questions drawn per module, minimum correct per module, overall pass mark in percent, time limit.gezogene Fragen je Baustein, Mindestzahl richtiger Antworten je Baustein, Gesamtbestehensgrenze in Prozent, Zeitlimit. |
attribution | Attribution | Author, source and licence (see below).Urheber, Quelle und Lizenz (siehe unten). |
media | [MediaItem] | Media of the quiz itself (cover image).Medien des Quiz selbst (Titelbild). |
Module (knowledge module)(Wissensbaustein)
| Field | Type | MeaningBedeutung |
id | text | Permanent unique ID (required).Dauerhafte eindeutige Kennung (Pflicht). |
version | number | Module version (default 1).Bausteinversion (Standard 1). |
title, i18n | text, {lang: text} | Title and its translations.Titel und seine Übersetzungen. |
description, language | text | Optional.Optional. |
chapters | [Chapter] | {id, title, description?, requires: [chapterId], i18n} – requires = chapters that must be mastered first (no cycles).requires = Kapitel, die vorher beherrscht sein müssen (keine Zyklen). |
catalogs | [Catalog] | {id, title, entries: [Choice], i18n} – shared answer catalogue, e.g. all fish species. The app shows all entries, never only four.gemeinsamer Antwortkatalog, z. B. alle Fischarten. Die App zeigt alle Einträge, nie nur vier. |
questions | [Question] | The questions.Die Fragen. |
media | [MediaItem] | All media used in the module.Alle im Baustein genutzten Medien. |
attribution | Attribution | Optional.Optional. |
allowReuse | bool | Others may include the published module in their own quizzes (default false).Andere dürfen den veröffentlichten Baustein in eigene Quizze einbinden (Standard false). |
Question
| Field | Type | MeaningBedeutung |
id | text | Permanent unique ID (required) – learning progress is attached to it, also across quizzes.Dauerhafte eindeutige Kennung (Pflicht) – daran hängt der Lernstand, auch quizübergreifend. |
rev | number | Content revision (default 1). Increases with essential changes of content or solution; learning progress then needs review.Inhaltsstand (Standard 1). Steigt bei wesentlicher Änderung von Inhalt oder Lösung; der Lernstand gilt dann als überprüfungsbedürftig. |
type | text | single · multiple · catalog · text · open (see section 3)(siehe Abschnitt 3) |
prompt | Prompt | {text?, image?, video?, i18n} – text, image, video or a combination; an image without text is allowed.Text, Bild, Video oder eine Kombination; ein Bild ohne Text ist erlaubt. |
options | [Choice] | {id, text?, image?, i18n} – answer options for single/multiple; if all have an image, the app shows an image choice.Antwortmöglichkeiten bei single/multiple; haben alle ein Bild, zeigt die App eine Bildauswahl. |
correct | [text] | IDs of the correct options or catalogue entries.Kennungen der richtigen Antworten bzw. Katalogeinträge. |
shuffle | bool | Shuffle options (default true).Antworten mischen (Standard true). |
catalogId, catalogMulti | text, bool | Catalogue question: which catalogue; whether several entries must be chosen.Katalogfrage: welcher Katalog; ob mehrere Einträge zu wählen sind. |
text | TextRule | {accepted: [text], caseSensitive?, ignoreAccents?, typoTolerance?, i18n: {lang: [text]}} – accepted spellings and alternative answers; typoTolerance = tolerated typos for answers of 5+ characters.zulässige Schreibweisen und alternative Antworten; typoTolerance = tolerierte Tippfehler ab 5 Zeichen. |
modelAnswer | Prompt | Model solution for free answers (text and/or image).Musterlösung bei freier Antwort (Text und/oder Bild). |
explanation, hint, source | text | Shown after answering. Translations: explanationI18n, hintI18n.Werden nach der Beantwortung angezeigt. Übersetzungen: explanationI18n, hintI18n. |
chapterId, topics, difficulty | text, [text], 1–5 | Structure, topics and difficulty.Gliederung, Themen und Schwierigkeitsgrad. |
next | Branching | {onCorrect?, onWrong?, byOption: {optionId: Target}}, Target = {question} | {chapter} | {end: true} – branching in a fixed learning path.Verzweigung im Lernpfad mit fester Reihenfolge. |
MediaItem & Attribution
| Field | Type | MeaningBedeutung |
path | text | Relative path in the ZIP (required).Relativer Pfad im ZIP (Pflicht). |
kind, mime | text | image | video, e.g.z. B. image/jpeg |
sha256, bytes | text, number | Checksum and size (the app checks them).Prüfsumme und Größe (die App prüft sie). |
width, height, durationMs | number | Optional.Optional. |
rightsConfirmed | bool | The creator confirmed holding the rights – required for publishing in the community.Der Ersteller hat die Rechte bestätigt – Pflicht für die Veröffentlichung in der Community. |
attribution | Attribution | {author?, source?, license?, licenseUrl?, notice?} – notice = required credit line, e.g. “Photo: M. Muster, CC BY 4.0”.notice = vorgeschriebene Namensnennung, z. B. „Foto: M. Muster, CC BY 4.0“. |
3. Question types
3. Fragetypen
| type | AnswerAntwort | SolutionLösung |
single | choose one option (or one image)eine Antwort (oder ein Bild) wählen | correct = exactly one option IDcorrect = genau eine Antwort-Kennung |
multiple | choose several optionsmehrere Antworten wählen | all correct and no wrong option must be chosenalle richtigen und keine falsche müssen gewählt sein |
catalog | choose from a large catalogue (scrollable, optional search)aus einem großen Katalog wählen (scrollbar, optional mit Suche) | correct = catalogue entry IDs; with several IDs and catalogMulti: false each one counts (synonyms)correct = Katalogeinträge; bei mehreren und catalogMulti: false zählt jeder (Synonyme) |
text | type the answerAntwort eintippen | text.accepted (+ translations in text.i18n); punctuation and spacing are ignoredtext.accepted (+ Übersetzungen in text.i18n); Satzzeichen und Leerraum zählen nicht |
open | free answer: sketch or writefreie Antwort: skizzieren oder schreiben | modelAnswer; judged by yourself, in a duel by the other player, in a race by the hostmodelAnswer; Bewertung selbst, im Duell durch den Mitspieler, im Wettlauf durch den Gastgeber |
Example
Beispiel
{
"format": "quizlane",
"formatVersion": 1,
"quiz": {
"id": "quiz-fishing-nrw",
"title": "Fischerprüfung NRW",
"language": "de",
"languages": ["en"],
"titleI18n": { "en": "Fishing licence exam NRW" },
"modules": [{ "id": "module-fish" }],
"exam": { "rules": [{ "moduleId": "module-fish", "count": 2, "minCorrect": 1 }], "passPercent": 60 }
},
"modules": [{
"id": "module-fish",
"title": "Fischkunde",
"catalogs": [{
"id": "catalog-fish", "title": "Fischarten",
"entries": [
{ "id": "fish-pike", "text": "Hecht", "i18n": { "en": "Pike" } },
{ "id": "fish-zander", "text": "Zander", "i18n": { "en": "Zander" } }
]
}],
"questions": [
{ "id": "q1", "type": "catalog", "prompt": { "image": "media/pike.jpg" },
"catalogId": "catalog-fish", "correct": ["fish-pike"] },
{ "id": "q2", "type": "text",
"prompt": { "text": "Wie heißt der Raubfisch mit „Entenschnabel“?", "i18n": { "en": "Which predator has a “duck bill”?" } },
"text": { "accepted": ["Hecht"], "i18n": { "en": ["Pike", "Northern pike"] } },
"explanation": "Der Hecht hat ein entenschnabelförmiges Maul." }
],
"media": [{ "path": "media/pike.jpg", "kind": "image", "mime": "image/jpeg", "rightsConfirmed": true,
"attribution": { "author": "M. Muster", "license": "CC BY 4.0" } }]
}]
}
4. CSV (spreadsheet)
4. CSV (Tabelle)
- One row per question. Separator
,, ; or tab is detected automatically; quoted fields follow RFC 4180. Several values in one cell are separated by |.
- Optional lines before the header:
# title: …, # description: …, # language: de, # path: chapters (chapters build on each other in order).
- Translations as extra columns
<column>@<lang>, e.g. question@en, options@en, correct@en, explanation@en, hint@en, chapter@en, module@en.
- Media: put the path (e.g.
media/pike.jpg) into the cell and the file into the ZIP. Options that look like image paths become image options.
- Column names are case-insensitive; German names work too (Frage, Antworten, Lösung, Kapitel, Erklärung …). Invalid rows are reported, valid rows are imported anyway.
- Eine Zeile pro Frage. Trennzeichen
,, ; oder Tab werden erkannt; Felder in Anführungszeichen nach RFC 4180. Mehrere Werte in einer Zelle trennt |.
- Optionale Zeilen vor der Kopfzeile:
# title: …, # description: …, # language: de, # path: chapters (Kapitel bauen in Reihenfolge aufeinander auf).
- Übersetzungen als zusätzliche Spalten
<spalte>@<sprache>, z. B. question@en, options@en, correct@en, explanation@en, hint@en, chapter@en, module@en.
- Medien: Pfad (z. B.
media/hecht.jpg) in die Zelle, Datei mit ins ZIP. Antworten, die wie Bildpfade aussehen, werden zu Bildantworten.
- Spaltennamen sind unabhängig von Groß/klein; deutsche Namen gehen auch (Frage, Antworten, Lösung, Kapitel, Erklärung …). Fehlerhafte Zeilen werden gemeldet, gültige trotzdem übernommen.
| ColumnSpalte | ContentInhalt |
type | single · multiple · catalog · text · open · image (also German: einfach, mehrfach, katalog, eingabe, frei, bild). Empty: derived – catalog column → catalog; no options → text (with solution) or open; several correct → multiple; otherwise single.(auch deutsch: einfach, mehrfach, katalog, eingabe, frei, bild). Leer: wird abgeleitet – Spalte catalog → catalog; keine Antworten → text (mit Lösung) bzw. open; mehrere richtige → multiple; sonst single. |
module, chapter, topics, difficulty | Module name (several modules per file possible), chapter, topics (|-separated), difficulty 1–5.Name des Bausteins (mehrere je Datei möglich), Kapitel, Themen (mit |), Schwierigkeit 1–5. |
question, image, video | Question text and/or media path.Fragetext und/oder Medienpfad. |
options | Answer options (|). For catalog questions: additional catalogue entries (distractors).Antwortmöglichkeiten (|). Bei Katalogfragen: weitere Katalogeinträge (Ablenker). |
correct | single/multiple: text of the correct option(s) or their number (1, 2, …); catalog: correct entries; text: accepted answers; open: model answer.single/multiple: Text der richtigen Antwort(en) oder ihre Nummer (1, 2, …); catalog: richtige Einträge; text: zulässige Antworten; open: Musterlösung. |
catalog | Name of the shared answer catalogue (entries are collected from all rows).Name des gemeinsamen Antwortkatalogs (Einträge werden aus allen Zeilen gesammelt). |
explanation, hint, source | Shown after answering.Werden nach der Beantwortung angezeigt. |
case_sensitive, ignore_accents, typos | Text answers: case matters (1/yes), ignore accents (1/yes), number of tolerated typos.Texteingabe: Groß/klein beachten (1/ja), Akzente ignorieren (1/ja), Zahl tolerierter Tippfehler. |
# title: My first quiz
# language: en
type,chapter,question,image,options,correct,catalog,explanation,question@de,options@de,correct@de
single,Basics,What is the capital of France?,,Paris|Lyon|Marseille,Paris,,Since 987.,Was ist die Hauptstadt von Frankreich?,Paris|Lyon|Marseille,
text,Basics,What is the capital of Iceland?,,,Reykjavík|Reykjavik,,,Wie heißt die Hauptstadt Islands?,,Reykjavík|Reykjavik
catalog,Fish,Which fish is this?,media/pike.jpg,Perch|Carp,Pike,Fish species,,Welcher Fisch ist das?,,Hecht
5. Checks on import
5. Prüfung beim Import
Before a quiz is accepted, the app checks structure, file references and media formats and shows understandable messages. Errors include, among others: missing title (quiz.titleMissing), missing module (quiz.moduleMissing), empty question (question.promptEmpty), fewer than two options (question.tooFewOptions), no or unknown solution (question.noCorrect, question.correctUnknown), single choice with more than one solution (question.singleNeedsOne), missing catalogue (question.catalogMissing), text question without accepted answer (question.textNoAnswer), free answer without model solution (question.modelAnswerMissing), duplicate IDs (id.duplicate), unsupported or missing media (media.unsupported, media.missing), and for publishing unconfirmed media rights (media.rightsUnconfirmed). Incomplete translations are only a warning (translation.incomplete).
Bevor ein Quiz übernommen wird, prüft die App Datenstruktur, Dateiverweise und Medienformate und zeigt verständliche Meldungen. Fehler sind u. a.: fehlender Titel (quiz.titleMissing), fehlender Baustein (quiz.moduleMissing), leere Frage (question.promptEmpty), weniger als zwei Antworten (question.tooFewOptions), keine oder unbekannte Lösung (question.noCorrect, question.correctUnknown), Einfachauswahl mit mehr als einer Lösung (question.singleNeedsOne), fehlender Katalog (question.catalogMissing), Texteingabe ohne zulässige Antwort (question.textNoAnswer), freie Antwort ohne Musterlösung (question.modelAnswerMissing), doppelte Kennungen (id.duplicate), nicht unterstützte oder fehlende Medien (media.unsupported, media.missing) und für die Veröffentlichung unbestätigte Medienrechte (media.rightsUnconfirmed). Unvollständige Übersetzungen sind nur ein Hinweis (translation.incomplete).