How to Import
How to import: Click the gear icon in the top-right of the subject header bar, then select "Import (.json)". Pick your
The file must be valid JSON. The
Minimum Valid File
Save the text below as
{
"_type": "dacosta-thinklab-backup",
"_version": 4,
"subject": {
"id": 1,
"name": "My Subject",
"color": "#2455a4"
},
"topics": [],
"questions": [],
"arrows": [],
"groups": [],
"procedures": [],
"procSteps": [],
"definitions": [],
"confusingTerms": []
}The subject
Topics
Each object in the
"topics": [ { "id": "t1", // unique string, you choose "name": "Derivatives", "col": "core", // "uncat" | "core" | "detail" | "secondary" "slot": 0, // vertical position, 0 is top of column "orderNum": 1, // number shown on card corner (optional) "topicType": "concept" // type badge (optional) } ]
Questions
Each object in the
"questions": [ { "id": 101, "text": "What is a derivative?", "stage": "unknown", // "unknown" | "heard" | "think" | "understood" "topicIds": ["t1"], "stuck": false, "myAnswer": "A derivative measures the rate of change.", "dependsOn": null, // id of prerequisite question, or null "depthChecks": [true,false,false,false,false,false], "depthNotes": ["It measures how fast something changes at one moment.","","","","",""], "sources": [ { "tag": "Book", "text": "Stewart Calculus Ch.3", "helped": true, "notClear": false } ], "mistakeItems": [ { "id": "m1", "text": "Confusing average rate with instantaneous rate", "type": "Understanding", "severity": "Would cause a problem", "resolved": false } ] } ]
Arrows (Connections)
Each object in the
"arrows": [ { "id": "a1", "from": "t2", "to": "t1", "type": "requires", "color": "#2455a4", "label": "Requires", "sentence": "Chain Rule requires Derivatives first.", "direction": "forward", "lineStyle": "dashed" } ]
Built-in
Groups
Groups visually cluster adjacent cards in the same column under a shared colour and label.
"groups": [ { "id": "g1", "name": "Differentiation Rules", "color": "#1a7a60", "col": "detail", "topicIds": ["t2", "t3"], "icon": "" } ]
The
Procedures and Steps
Procedures are visual flowcharts. Each procedure has a list of steps placed on a column/row grid. Steps can have ThinkNote modules attached (text, code, YouTube, images, etc.).
"procedures": [ { "id": "proc1", "name": "How to take a derivative" } ], "procSteps": [ { "id": "st1", "procedureId": "proc1", "col": 0, "row": 0, "title": "Identify the function", "description": "Write down f(x) clearly", "type": "Start", // "Start"|"Task"|"Decision"|"Input"|"Sub-process"|"End" "color": "#1a7a60", "icon": "", "connections": [ { "id": "c1", "toStepId": "st2", "label": "next", "type": "Next", "color": "#1a7a60", "sentence": "Once you have identified the function, apply the power rule." } ], "linkTo": null, "modules": [ { "id": "row1", "slots": [ { "id": "s1", "type": "text", "content": "Always write the original function first." } ] } ] }, { "id": "st2", "procedureId": "proc1", "col": 1, "row": 0, "title": "Apply the power rule", "description": "Bring down the exponent and reduce by 1", "type": "Task", "color": "#2455a4", "icon": "", "connections": [], "modules": [ { "id": "row2", "slots": [ { "id": "s2", "type": "code", "content": "f(x) = x^3\nf'(x) = 3x^2", "language": "plaintext" }, { "id": "s3", "type": "youtube", "youtubeUrl": "https://www.youtube.com/watch?v=example", "startTime": 120, "chapters": [ { "time": 0, "label": "Intro" }, { "time": 120, "label": "Power rule explained" } ] } ] } ] } ]
Procedure fields
Step fields
Module slot types
Each slot in a module row must have an
Connection fields
Each object in a step's
Definitions
The
"definitions": [ { "id": "def1", "term": "Derivative", "definition": "A measure of how a function changes as its input changes." } ]
Confusing Terms
The
"confusingTerms": [ { "id": 1, "term": "differential", "count": 1 } ]
Complete Working Example
This file demonstrates every data type: topics, questions with ThinkNotes and sources and mistakes, connections, groups, a procedure with steps and modules, definitions, and confusing terms. Copy it, save as
{
"_type": "dacosta-thinklab-backup",
"_version": 4,
"subject": { "id": 1, "name": "Calculus", "color": "#2455a4" },
"topics": [
{ "id": "t1", "name": "Derivatives", "col": "core", "slot": 0, "topicType": "concept" },
{ "id": "t2", "name": "Chain Rule", "col": "detail", "slot": 0, "topicType": "method" },
{ "id": "t3", "name": "Product Rule", "col": "detail", "slot": 1, "topicType": "method" },
{ "id": "t4", "name": "Limits", "col": "core", "slot": 1, "topicType": "concept" }
],
"questions": [
{
"id": 101,
"text": "What is a derivative?",
"stage": "think",
"topicIds": ["t1"],
"stuck": false,
"myAnswer": "A derivative measures the instantaneous rate of change of a function.",
"depthChecks": [true, true, false, false, false, false],
"depthNotes": [
"It measures how fast something changes at one specific moment.",
"Students often confuse average rate of change with instantaneous rate.",
"", "", "", ""
],
"sources": [
{ "tag": "Book", "text": "Stewart Calculus Ch.3", "helped": true, "notClear": false }
],
"mistakeItems": [
{
"id": "m1",
"text": "Confusing average rate with instantaneous rate",
"type": "Understanding",
"severity": "Would cause a problem",
"resolved": false
}
]
},
{
"id": 102,
"text": "When do I use Chain Rule vs Product Rule?",
"stage": "unknown",
"topicIds": ["t2", "t3"],
"stuck": false,
"dependsOn": 101
},
{
"id": 103,
"text": "What is a limit and why does it matter for derivatives?",
"stage": "heard",
"topicIds": ["t4", "t1"],
"stuck": "dontget"
}
],
"arrows": [
{
"id": "a1", "from": "t2", "to": "t1",
"type": "requires", "color": "#2455a4", "label": "Requires",
"direction": "forward", "lineStyle": "dashed",
"sentence": "Chain Rule requires understanding Derivatives first."
},
{
"id": "a2", "from": "t4", "to": "t1",
"type": "supports", "color": "#1a7a60", "label": "Supports",
"direction": "forward", "lineStyle": "solid",
"sentence": "A derivative is defined as a limit."
}
],
"groups": [
{
"id": "g1", "name": "Differentiation Rules",
"color": "#1a7a60", "col": "detail",
"topicIds": ["t2", "t3"], "icon": ""
}
],
"procedures": [
{
"id": "proc1", "name": "How to differentiate a function",
"attachedTopicIds": ["t1"],
"attachedQIds": []
}
],
"procSteps": [
{
"id": "st1", "procedureId": "proc1",
"col": 0, "row": 0,
"title": "Identify the function",
"description": "Write down f(x) clearly",
"type": "Start", "color": "#1a7a60",
"linkTo": null,
"connections": [{
"id": "c1", "toStepId": "st2", "label": "next",
"type": "Next", "color": "#1a7a60",
"sentence": "Once you have identified the function, decide which rule to apply."
}],
"modules": [
{
"id": "row1",
"slots": [{ "id": "s1", "type": "text", "content": "Always write the original function first." }]
}
]
},
{
"id": "st2", "procedureId": "proc1",
"col": 1, "row": 0,
"title": "Choose the differentiation rule",
"description": "Is it power rule, chain rule, or product rule?",
"type": "Decision", "color": "#c06a10",
"linkTo": null,
"connections": [{
"id": "c2", "toStepId": "st3", "label": "power rule",
"type": "If yes", "color": "#c06a10",
"sentence": "If the function is a simple polynomial, use the power rule."
}],
"modules": []
},
{
"id": "st3", "procedureId": "proc1",
"col": 2, "row": 0,
"title": "Apply and simplify",
"description": "Compute f'(x) and simplify",
"type": "Task", "color": "#2455a4",
"linkTo": "st1",
"connections": [],
"modules": [
{
"id": "row2",
"slots": [
{ "id": "s2", "type": "code", "content": "f(x) = x^3\nf'(x) = 3x^2", "language": "plaintext" },
{ "id": "s3", "type": "text", "content": "Bring down the exponent, subtract 1 from it." }
]
}
]
}
],
"definitions": [
{
"id": "def1",
"term": "Derivative",
"definition": "A measure of how a function changes as its input changes."
},
{
"id": "def2",
"term": "Limit",
"definition": "The value a function approaches as the input approaches some value."
}
],
"confusingTerms": [
{ "id": 1, "term": "differential", "count": 2 },
{ "id": 2, "term": "antiderivative", "count": 1 }
],
"connTypes": [
{ "id": "requires", "label": "Requires", "color": "#2455a4" },
{ "id": "supports", "label": "Supports", "color": "#1a7a60" }
],
"srcTags": ["Book", "Video", "Course"]
}Before importing, check: Valid JSON with no trailing commas. Every topic
If the import silently fails, paste your file into jsonlint.com to find syntax errors first.