Content specification
Format versions
Seedlingo v1.4.0 and above requires format version 1.4.0.
Seedlingo v1.3.0 and above requires format version 1.3.0.
Seedlingo v1.0.0 and above requires format version 1.2.1.
Seedlingo v0.91.0 and above requires format version 1.1.1.
Seedlingo v0.9.0 requires format version 1.1.0.
ContentSpec.json
The root content specification file is ContentSpec.json. It must be present under that name. ContentSpec.json describes the file structure of the content.
formatVersion
Mandatory field of type string.
"formatVersion": "1.4.0"
formatVersion is used by the Seedlingo app to determine how the file can be expected to be formatted.
instructions
Mandatory field of type Array; must contain 8 specific instruction paths of type string.
"instructions": [
"welcome": "welcome.mp3",
"homeButton": "audio/homeButton.mp3",
...
]
instructions is a collection of paths to audio files instructing the user on how to interact with various app features. Each entry must point to an audio file with a path relative to the content folder.
Mandatory sub-fields of type string:
welcome- the message played the first few times a user opens the apphomeButton- the instruction audio attached to the home buttoncontinueButton- the instruction audio attached to the continue buttontoggleInstructionsButton- the instruction audio attached to the instruction overlay togglematchingExercise- an audio file describing how to solve a matching exercisemultipleChoiceExercise- an audio file describing how to solve a multiple-choice exercisesingleClozeExercise- an audio file describing how to solve a single-cloze exercisemultiClozeExercise- an audio file describing how to solve a multi-cloze exercise
wordSpecFile
Mandatory field of type string.
"wordSpecFile": "WordSpec.json"
wordSpecFile is a path to the file specifying every word used in any unit (see Word-specification).
units
Mandatory field of type Array; must contain at least one unit.
"units": [
{
"name": "My first unit",
"icon": "mdiNumeric",
"introductionAudio": "audio/introduction/DescriptionOfUnit1.mp3",
"unitSpecFile": "Unit1Spec.json"
},
{...}
]
units is a collection of unit descriptions, referencing the unit specification through unitSpecFile.
Each unit must have the following mandatory fields of type string:
name, the name of the unit, currently not displayed anywhereicon, the name of a Material Design icon, prefixed withmdiand Camel-Cased, so thatnumeric-1becomesmdiNumeric1introductionAudio, the relative path to the audio introducing the unitunitSpecFile, the relative path to the file containing the specification for the unit (see Unit-specification).
Word-specification
The word-specification defines the relationship between words and their corresponding media, i.e. audio, picture, video and/or symbol (i.e. icon).
formatVersion
Mandatory field of type string.
"formatVersion": "1.4.0"
formatVersion is used by the Seedlingo app to determine how the file can be expected to be formatted.
wordCount
Mandatory field of type number.
"wordCount": "5"
wordCount is the number of words specified in the word-specification. This number can be counted by searching the file for audio, a mandatory sub-field, and counting the occurrences. Running the content specification validation will inform you if the number is incorrect.
words
Mandatory field of type object where the keys are unique strings, and the value is an object with a mandatory word field, and any of the optional audio, picture, video or symbol fields.
"words": {
"e4cbe366-e875-4399-aa73-468eb72af1e5": {
"word": "one",
"audio": "audio/one.mp3",
"symbol": ["mdiNumeric1"]
},
{...}
}
Each word must have the following mandatory field of type string:
word, the orthographic representation of the word in the target language, e.g. "one" or "我"
Each word can have any or none of the following optional fields:
audio, the path (string) to the audio file representing the pronunciation of the wordpicture, the path (string) to the picture representing the wordvideo, the path (string) to the video representing the wordsymbol, a list (Array) of one or more names (strings) of Material Design icons, prefixed withmdiand Camel-Cased, so thatnumeric-1becomesmdiNumeric1
Unit-specification
The unit-specification defines which exercises to include in a unit, and which words from the word-specification to include in an exercise.
formatVersion
Mandatory field of type string.
"formatVersion": "1.4.0"
formatVersion is used by the Seedlingo app to determine how the file can be expected to be formatted.
id
Mandatory field of type string.
"id": "bb0c1d6f-7d00-4700-8b6c-053d2ad0bb7c"
id is a unique identifier for a unit specification, preferably a GUID.
unitIndex
Mandatory field of type number.
"unitIndex": "1"
unitIndex is the order in which this unit should appear in the unit overview.
multipleChoiceCount
Mandatory field of type number.
"multipleChoiceCount": "8"
multipleChoiceCount is the number of exercises in the unit of the type MultipleChoice.
matchingCount
Mandatory field of type number.
"matchingCount": "8"
matchingCount is the number of exercises in the unit of the type Matching.
explanationCount
Mandatory field of type number.
"explanationCount": "8"
explanationCount is the number of exercises in the unit of the type Explanation.
It is currently not possible to specify either ExplanationMatching or ExplanationMultipleChoice; Seedlingo will randomly choose to present an Explanation-exercise as either an ExplanationMatching-exercise or an ExplanationMultipleChoice-exercise.
singleClozeCount
Mandatory field of type number.
"singleClozeCount": "8"
singleClozeCount is the number of exercises in the unit of the type SingleCloze.
multiClozeCount
Mandatory field of type number.
"multiClozeCount": "8"
multiClozeCount is the number of exercises in the unit of the type MultiCloze.
comprehensionCount
Mandatory field of type number.
"comprehensionCount": "8"
comprehensionCount is the number of exercises in the unit of the type Comprehension.
wordsExercisedCount
Optional field of type number.
"wordsExercisedCount": "8"
wordsExercisedCount is the number of unique words referenced in the unit as valid correct options through exercises, i.e. words that are being exercised in this unit. Words that are provided as incorrect alternatives should be excluded from this count.
exercises
Mandatory field of type Array; must contain at least one exercise.
exercises is a collection of exercise definitions specifying which words from the Word-specification to practice through a particular type of exercise, and which words to provide as incorrect options if needed.
Each exercise must have the following mandatory fields of type string:
id, the unique id of the exercisetype, the type of exercise, which has to be one of these:MultipleChoiceMatchingExplanationSingleClozeMultiClozeComprehension
Depending on the type, an exercise should have certain additional fields.
MultipleChoice
multipleChoiceSpec(mandatory), anObjectdefining the multiple choice exercise, containing:multipleChoiceWords(mandatory), a list (Array) of at least 4 unique word-references
"exercises": [
{
"id": "dc760ae7-0804-4d5b-8102-c78b49ded883",
"type": "MultipleChoice",
"multipleChoiceSpec": {
"multipleChoiceWords": [
{ "one": "00bb28fc-ca72-4c60-b04e-9484771a5303" },
{ "two": "89377ac8-f03a-43af-b701-168e5c02757f" },
{...}
]
}
},
{...}
]
Matching
matchingSpec(mandatory), anObjectdefining the matching exercise, containing:matchingWords(mandatory), a list (Array) of at least 2 unique word-referencesunsuppressWordAudio(optional), aboolean(trueorfalse) override to allow audio cues for word tiles to play before a word tile has been matched to its picture/symbol tile. Defaults tofalse.
"exercises": [
{
"id": "7ce5fd1b-7b94-4ff7-8940-6c09301b10aa",
"type": "Matching",
"matchingSpec": {
"matchingWords": [
{ "two": "89377ac8-f03a-43af-b701-168e5c02757f" },
{ "three": "f2b83c98-23a5-49d6-a366-a4530fdde789" },
],
"unsuppressWordAudio": false
}
},
{...}
]
Explanation
explanationSpec(mandatory), anObjectdefining the explanation exercise, containing:explanation(mandatory), a list (Array) of at least one word-reference forming a keyword, synonym or some other form of explanation that serves as the clue to identify which single word the explanation points to.explanationTargets(mandatory), anObjectdefining the correct target word (valid option) the explanation hints to, as well as a few incorrect alternatives (invalid options) that the correct alternative can hide among.audio(optional), the relative path (string) to the audio file representing the pronunciation of the explanationpicture(optional), the relative path (string) to a picture representing the explanationvideo(optional), the relative path (string) to a video representing the explanationsymbol(optional), a list (Array) of one or more names (strings) of Material Design icons, prefixed withmdiand Camel-Cased, so thatnumeric-1becomesmdiNumeric1, representing the idea conveyed by the explanation.
"exercises": [
{
"id": "df7e8b41-d7bb-4dd8-acab-69a0c0045664",
"type": "Explanation",
"explanationSpec": {
"explanation": [
{ "mama's": "2e803a36-22d3-4183-994a-00d4a2837b39" },
{ "mama": "14bb0008-1397-4684-8ef5-2f524524fc84" }
],
"explanationTargets": {
"validOption": { "grandma": "8c40dd19-996c-428b-8962-212bd7e1c63c" },
"invalidOptions": [
{ "grandpa": "97646a8e-33ee-4e43-a95d-4eeead0c4f94" },
{ "uncle": "5cd464a3-a04a-4ad2-9565-091036425550" },
{ "aunt": "e045242e-1867-444c-baf4-01f5d3f59fe3" }
]
},
"audio": "audio/mamasmama.mp3",
"symbol": ["mdiHumanFemale"]
}
},
{...}
]
SingleCloze
singleClozeSpec, anObjectdefining the cloze exercise, containing:text(mandatory), a list (Array) of elements that make up a cloze sentence (fill-the-blank sentence) with a single blank, correct target words (valid options) that will complete the sentence in a way that makes the sentence meaningful and grammatically correct, as well as a few incorrect alternatives (invalid options) that the correct alternative can hide among.Object's intextmust have one of these shapes:- a word-reference using a
stringkey, like 'grandma', and a word-reference value matching the word key as uniquely defined in the word spec file, e.g{ "grandma": "family-word-number-28" } - two lists (
Array), one ofvalidOptionsand one ofinvalidOptions, indicating that this entry in thetextis a blank/gap that has a set of valid alternatives that would make sense of the completed text, and a set of invalid alternatives that will be treated as incorrect answers. Either list should exclusively contain word-references as described above. For a cloze exercise with only one blank/gap,singleClozeSpec.textmust contain one and only one reference tovalidOptionsandinvalidOptions.
- a word-reference using a
suppressClozeAudio(optional), aboolean(trueorfalse) that specifies whether to prohibit users hearing the pronunciation of a word when tapping a word in the cloze sentence (suppressClozeAudio: true), or to allow users to hear the pronunciation of words (not blanks) they tap in the cloze sentence (suppressClozeAudio: false). Defaults tofalse.suppressOptionAudio(optional), aboolean(trueorfalse) that specifies whether to prohibit users hearing the pronunciation of an option when tapping it (suppressOptionAudio: true), or to allow users to hear the pronunciation when they tap an option (suppressOptionAudio: false). Defaults tofalse.
"exercises": [
{
"id": "ddac5f75-c5af-4734-8455-b76b425e8bfb",
"type": "SingleCloze",
"singleClozeSpec": {
"text": [
{ "他": "c53add23-aba4-42f5-9fbb-d6a6d1d8882c" },
{ "是": "bc1ec01c-0fde-4e63-82e6-c0f78d01529e" },
{ "我": "9f4c842a-e36a-48b1-aa4b-955aedef35d2" },
{ "的": "843f4af4-5dcb-44a4-b690-759db29999c4" },
{
"validOptions": [
{ "爸爸": "3773c800-4f9b-4951-b7a7-9e0c9861d089" },
{ "哥哥": "4e43f1dd-bdd8-4cfb-ad27-8446e44cc754" },
{ "弟弟": "802939da-7ac0-409c-bfb2-b0d6f81e2f56" },
{ "姥爷": "6c0f975c-4364-40c7-ae72-cfc2145da7e3" },
{ "爷爷": "1ad7f2f9-521a-4a00-b549-bd4ee081149b" },
{ "丈夫": "76004162-7f5b-4e28-bda5-bbcb39be8165" },
{ "大哥": "3eac3c44-25ef-434e-9e94-1fc71e510557" },
{ "二哥": "abb4c7a4-0c11-4f29-8506-a852f04a0ef5" },
{ "大弟弟": "0fcce854-d190-4e88-a3fe-da2e4763f48c" },
{ "小弟弟": "1846e964-c362-417a-815d-3319b2b6aca5" },
{ "姐夫": "c48bf08b-df1b-4fa8-a41b-15405ecebf49" },
{ "妹夫": "98d18086-a60a-4f81-80b3-e05bd2aaa400" },
{ "儿子": "af7cc883-0091-4d24-800e-95ca67ee451c" },
{ "外孙": "bb91deac-cbe1-4314-b7d3-9662cc82d446" },
{ "孙子": "4e594d79-ec54-4cc7-8ef0-2a950ebb2de3" },
{ "外甥": "54ff3fa1-141e-4620-861d-335376b3f8f2" },
{ "侄子": "dda9c23b-503d-4ada-8293-3450c8bfae7c" }
],
"invalidOptions": [
{ "妈妈": "8da1e3a6-3268-40da-8707-be2a2c902c16" },
{ "姐姐": "b521f4d2-1084-4f17-af18-1bd6738d23a0" },
{ "妹妹": "8ee121b4-8522-4e16-91b7-8a2af070efd8" },
{ "姥姥": "d63f08dd-f8e6-4b47-940b-8d9d939034a6" },
{ "奶奶": "5cd464a3-a04a-4ad2-9565-091036425550" },
{ "妻子": "9ca14628-fd31-4f36-8f99-70dd7c9c8b28" },
{ "大姐": "891c12fc-23a3-4bb9-9744-dbaf2e785624" },
{ "二姐": "1d9b329c-a2fa-4eaa-aa2c-39d026a898a7" },
{ "大妹妹": "8531fafd-fd6c-47a2-861b-c401362f17c2" },
{ "小妹妹": "683a0834-e76f-44b4-9858-467b63380147" },
{ "嫂子": "afaf98c8-5f3d-4be9-8338-3f2942e6be17" },
{ "弟妹": "75a122a7-4a08-4333-acf1-072483f6a570" },
{ "女儿": "34d92533-9c8c-4469-b050-2638f2b5f4d5" },
{ "外孙女": "83ded6b2-d80b-4a78-bd10-00d4822aefb9" },
{ "孙女": "7f3cd2dd-da20-4c3c-8fb1-d6beefb43d0e" },
{ "外甥女": "b6ebbe69-9834-41f3-a353-4a9142d599b3" },
{ "侄女": "0087add3-b033-4cac-bb6b-cebf1c1acdd0" }
]
}
],
"suppressClozeAudio": false,
"suppressOptionAudio": false
}
},
{...}
]
MultiCloze
multiClozeSpec, anObjectdefining the cloze exercise, containing:text(mandatory), a list (Array) of elements that make up a cloze sentence (fill-the-blank sentence) with words interspersed with multiple blanks as lists of correct target words (valid options) that will complete the sentence in a way that makes the sentence meaningful and grammatically correct, if put in the correct order. The key to solving the exercise is to connect the valid word to the corresponding blanks.Object's intextmust have one of these shapes:- a word-reference using a
stringkey, like 'grandma', and a word-reference value matching the word key as uniquely defined in the word spec file, e.g{ "grandma": "family-word-number-28" } - a list (
Array) calledvalidOptionscontaining exactly one entry indicating that this entry in thetextis a blank/gap that has exactly one correct alternative that will make sense of the completed text. The list entry must be a word-reference as described above.multiClozeSpec.textmust contain at least two objects containingvalidOptions.
- a word-reference using a
suppressClozeAudio(optional), aboolean(trueorfalse) that specifies whether to prohibit users hearing the pronunciation of a word when tapping a word in the cloze sentence (suppressClozeAudio: true), or to allow users to hear the pronunciation of words (not blanks) they tap in the cloze sentence (suppressClozeAudio: false). Defaults tofalse.suppressOptionAudio(optional), aboolean(trueorfalse) that specifies whether to prohibit users hearing the pronunciation of an option when tapping it (suppressOptionAudio: true), or to allow users to hear the pronunciation when they tap an option (suppressOptionAudio: false). Defaults tofalse.
"exercises": [
{
"id": "6b941a32-89f3-4436-ac53-f2769cb0d3b3",
"type": "MultiCloze",
"multiClozeSpec": {
"multiClozeText": [
{ "我": "9f4c842a-e36a-48b1-aa4b-955aedef35d2" },
{ "的": "843f4af4-5dcb-44a4-b690-759db29999c4" },
{ "妈妈": "8da1e3a6-3268-40da-8707-be2a2c902c16" },
{ "有": "35389a5a-4493-44e5-a8ae-dc0a30c98dbf" },
{ "四": "da473305-758c-40c0-a61b-d9de0aefb5a4" },
{ "个": "90f79865-ac90-4644-9a8b-88eaad30e979" },
{
"validOptions": [
{ "孩子": "c8de49d6-d26a-4d62-b959-83cf57327387" }
]
},
{ ":": "526a8ee7-7525-4b0f-a3a2-92e29618bed3" },
{ "两": "5dbf7670-f66d-46e4-b971-8f8d6de95a5c" },
{ "个": "90f79865-ac90-4644-9a8b-88eaad30e979" },
{ "儿子": "af7cc883-0091-4d24-800e-95ca67ee451c" },
{ ",": "3fde2b11-aa78-4a96-9bd4-75c8462132b6" },
{ "两": "5dbf7670-f66d-46e4-b971-8f8d6de95a5c" },
{ "个": "90f79865-ac90-4644-9a8b-88eaad30e979" },
{
"validOptions": [
{ "女儿": "34d92533-9c8c-4469-b050-2638f2b5f4d5" }
]
},
{ "。": "5d0f410c-83ff-43bd-a31e-922b42b054ef" },
{ "我": "9f4c842a-e36a-48b1-aa4b-955aedef35d2" },
{ "有": "35389a5a-4493-44e5-a8ae-dc0a30c98dbf" },
{ "两": "5dbf7670-f66d-46e4-b971-8f8d6de95a5c" },
{ "个": "90f79865-ac90-4644-9a8b-88eaad30e979" },
{
"validOptions": [
{ "姐姐": "b521f4d2-1084-4f17-af18-1bd6738d23a0" }
]
},
{ ",": "3fde2b11-aa78-4a96-9bd4-75c8462132b6" },
{
"validOptions": [
{ "一": "1d936b6b-e44c-466c-8d04-ab52643670c2" }
]
},
{ "个": "90f79865-ac90-4644-9a8b-88eaad30e979" },
{ "弟弟": "802939da-7ac0-409c-bfb2-b0d6f81e2f56" },
{ "。": "5d0f410c-83ff-43bd-a31e-922b42b054ef" }
],
"suppressClozeAudio": false,
"suppressOptionAudio": false
}
},
{...}
]
Comprehension
comprehensionSpec(mandatory), anObjectdefining the comprehension exercise, containing:text(mandatory), a list (Array) of word-references to words that make up a short text forming the base for the comprehension exercise.Object's intextmust have this shape:- a word-reference using a
stringkey, like 'grandma', and a word-reference value matching the word key as uniquely defined in the word spec file, e.g{ "grandma": "family-word-number-28" }
- a word-reference using a
multipleChoiceSpec(optional), anObjectdefining a multiple-choice exercise to include in the comprehension exercise. The specification here should follow the general specification for multiple-choice exercises as defined above.matchingSpec(optional), anObjectdefining a matching exercise to include in the comprehension exercise. The specification here should follow the general specification for matching exercises as defined above.comprehensionQuestions(mandatory), a list (Array) of questions to pose with answer options. Each questions must be anObjectwith this shape:questionText(mandatory), astringposing the question in written form.questionAudio(mandatory), the path (string) to the audio file for the questionoptions(mandatory), a list (Array) ofObjects defining a possible answer to the question, of the shape:word(mandatory), a reference to a word in the word-speccorrect(optional), aboolean(trueorfalse) indicating whether this option is the correct answer. Default tofalse.
comprehensionStages(optional), a list (Array) of stages for the comprehension exercise. A stage spec must have the following shape:instructionText(optional), an instruction (string) describing the nature of the stage and what is expected of the user for this stageinstructionAudio(optional), a path (string) to the audio file for the instruction for this stagequestionnaire(optional), aboolean(trueorfalse) indicating that this stage should use thecomprehensionQuestionsto form a questionnaire-stage. Defaults tofalse.onlyInstructionOnRequest(optional), aboolean(trueorfalse) indicating whether the instruction for this stage should be suppressed until the user asks for it (true), or should be played automatically (false). Defaults tofalse.
suppressOptionAudio(optional), aboolean(trueorfalse) indicating whether to prevent the audio on answer options to be played before the correct answer has been found. Defaults tofalse.
"exercises": [
{
"id": "45e04dde-17d0-4842-a685-c10f3d11d6d3",
"type": "Comprehension",
"comprehensionSpec": {
"text": [
{ "We": "a300d857-21d1-4e9d-b1e9-ac120f038708" },
{ "are": "2000898c-9972-4971-807b-365d38db8bb0" },
{ "three": "eac2f9c5-8dca-49f4-b972-022dd174a9b1" },
{ "people": "d3e928c7-1cfe-426b-96f6-98c7b65d1077" },
{ "in": "08175114-13e9-4802-b5d3-458c58f289a2" },
{ "my": "c1f71e0c-62e7-41f5-ae48-320f60ba639f" },
{ "family": "1abb6ead-f22a-4565-99cc-26a412c9ca48" },
{ ".": "a64c2a49-916a-4109-a385-83915288c3b1" }
],
"matchingSpec": {
"matchingWords": [
{ "two": "89377ac8-f03a-43af-b701-168e5c02757f" },
{ "three": "f2b83c98-23a5-49d6-a366-a4530fdde789" },
]
},
"comprehensionQuestions": [
{
"questionText": "How many people are there in this family?",
"questionAudio": "audio/unit02-1-q1.mp3",
"options": [
{
"correct": true,
"word": {
"three": "923c82a4-5425-4fbe-95b3-66901a667c23"
}
},
{
"word": {
"you": "2122a3a3-d4f6-42ea-a2a5-38f8865cc851"
}
}
]
},
"comprehensionStages": [
{
"instructionText": "Read the text carefully, then answer questions about the text.",
"instructionAudio": "audio/comprehension-1.mp3"
},
{
"questionnaire": true
},
{
"instructionText": "Click an alternative to suggest the answer to the question.",
"instructionAudio": "audio/comprehension-2.mp3"
},
{
"instructionText": "Practice some new words with this matching exercise.",
"instructionAudio": "audio/comprehension-3.mp3"
},
{
"instructionText": "Finally, re-read the text and click on words you don't recognize to hear their pronunciation.",
"instructionAudio": "audio/comprehension-4.mp3"
}
]
]
}
}
]