Getting Started in 5 Steps
Click "+ Add subject" at the bottom of the left sidebar. Give it a clear name and pick a colour. One subject, one page. You can promote topics to their own sub-pages later when they grow complex enough to need it.
Click "+ Add topic" in the Topic Board header. Do not organise yet. Get everything out of your head first. Once they are all visible, drag cards into Core, Important Detail, or Additional Details. Then Ctrl+click two cards to draw a connection between them and describe the relationship.
Click "+ Add question" in the Questions header. Write the question, then click topic names to link it to them. Every question starts at Unknown.
Click any stage dot on a question row to set its stage. When something blocks you, open Deep Dive and use the "Feeling Blocked?" section at the bottom to mark the question as stuck.
Click "Deep Dive" on any question at "I Can Explain It". Complete at least two of the six depth check sections by writing answers in the text areas and ticking them. Once two are done, the Advance button unlocks and you can move the question to "I Can Use It".
Do not wait until the Topic Board is perfectly organised before adding questions. Do not wait until all questions are in before starting to study. Structure emerges from use, not from planning.
The goal is not a perfectly filled app. The goal is knowledge you can actually use.
What is this app?
Most people learn by collecting notes, watching videos, and hoping things stick. The problem is not effort, it is structure. Without structure, learning feels productive but results in shallow retention and isolated knowledge that cannot be applied when it matters.
This app gives your learning a system. It helps you capture what you are trying to understand, organise it into meaningful topics, track how well you actually know each thing, and then deeply interrogate that knowledge until it becomes genuinely yours.
It works for any complex subject. Theoretical topics like calculus, procedural topics like Python programming, or anything in between.
The core insight: Most people confuse exposure with understanding. Seeing information once, even understanding it in the moment, is not the same as owning it. This app forces the gap between those two things into view, and gives you the tools to close it.
The Layout
The app is organised into one page per subject. Each page has three sections arranged in an L-shape:
You can drag the horizontal divider between the Questions section and the Topic Board up or down to give more screen space to whichever you are using. The "understanding" panel that opens on the right after you clicik the "deep dive" button on any question can be resized by dragging its left edge.
The Topic Board
The Topic Board is where you build the structure of your knowledge. A topic is anything you need to learn: a concept, a technique, a tool, a term. Topics do not need to be understood yet. They just need to exist so nothing gets lost.
Adding topics
Click "+ Add topic" in the Topic Board header. A modal appears with the following fields. The name is required; everything else is optional.
Right-click any card at any time to edit its name, type, number, or to retire it. Retired topics are hidden but not deleted; a toggle in the Topic Board header (on the top right) reveals them.
The four columns
Drag any topic card left or right to move it between columns. The columns are not labels you assign once. They should reflect your current understanding of the subject and you should update them as that understanding deepens.
To reorder cards within a column, drag them up or down. To move multiple cards at once, click and drag across empty column space to draw a selection rectangle, then drag any selected card and the rest follow. Right-click a column header to rename it if the default label does not fit your subject.
What a topic card shows
Each card gives you live information about that topic's state without opening anything.
Drawing connections between topics
Ctrl+click the first card, then Ctrl+click the second. A bar appears at the top of the Topic Board showing both card names. In that bar, open the dropdown and select a relationship type such as Requires, Leads to, Extends, or Causes. Then type a one-sentence description of the specific relationship in the text field. Click "Add connection". A curved arrow appears between the two cards, colour-coded by its relationship type, with the first letter of the label on the curve. Hover over any arrow to read the full sentence in the header bar.
To create a custom connection type that does not exist in the list, select "+ Custom..." from the dropdown.
A small modal opens where you define the label and colour. That type is then available for all future connections in this subject.
To edit or delete an existing connection, click "Connections" in the Topic Board header to open the Connection Manager. Every connection is listed with its two endpoints, editable label, sentence, colour, and line style. Click the X on any row to delete it. Changes save immediately.
Grouping topics
Shift+click two or more cards that are adjacent in the same column. A bar appears at the top of the Topic Board showing the count selected and whether they are contiguous. Cards must be adjacent; the bar shows a warning if they are not. Once "Ready to group" appears, click the "Group" button in the bar. A modal opens where you type the group name, pick a colour, and optionally choose an icon from the icon picker.
Click "Create group". The selected cards get a shared coloured border and a named label at the bottom of the group box. To delete a group, right-click the group label area and select the delete option.
Promoting a topic to its own subject
Right-click any topic card and select "Promote to subject". A new subject is created named after that topic and linked to the original card. The card stays on the parent board with a badge showing the linked subject's name. Click that badge to navigate to the new subject. Use this when a single topic grows complex enough to need its own full Topic Board and Questions section rather than just a few linked questions.
A topic might be a secondary detail in a specific subject, but it might warrants its own dedicated subject page for you to learn that topic in much more depth in its own isolated environment.Questions
Every question you have about your subject lives here. Each question tracks one thing: how well you actually understand the answer right now. The stage is yours to set, and you move it forward only when your understanding genuinely shifts.
Adding questions
Click "+ Add question" in the Questions header. A modal opens.
Type your question in the text area, then click topic names below to link the question to them. You can link one question to multiple topics. Click "Add question" to confirm. The question appears in the list at the Unknown stage.
If no topics apply yet, leave the list empty. Unlinked questions collect in a separate "Unlinked" group at the bottom of the Questions section. To link a question later, right-click it and select "Edit question". The same modal reopens with all fields editable.
The four stages
Each question row shows four stage dots on the right side. The filled dot is the current stage. Click any dot to jump directly to that stage. The stages are intentionally honest. It's recommended not to move a question to "I Can Explain It" when you cannot.
Linking questions to topics
When a question is linked to a topic, a coloured tag appears on the question row showing the topic name. The tag colour matches the column that topic is in. To change links after creation, right-click the question and select "Edit question". Toggle topics on or off in the modal and confirm.
Filtering by topic
Click any topic card in the Topic Board below to select it. Then toggle the filter button at the top of the Questions header to show only questions linked to that topic. Click the filter button again to return to showing all questions. This is essential for focused study sessions where you want to work through one area without distraction from the rest of the subject.
Sorting and view options
Click the hamburger menu in the Questions header to reveal additional controls. You can sort by stage (best to worst or worst to best), alphabetically, or by newest first. You can switch to a compact "thin" view that shows more questions on screen with less detail per row. Pinned questions always stay at the top regardless of sort order. To pin a question, right-click it and select "Pin question". To unpin, right-click again and select "Unpin question".
Question evolution: merging one question into another
As you study, a vague early question often becomes obsolete once a sharper one replaces it. To absorb the old question into the new one, drag the older question by its row and drop it directly on top of the newer, sharper question. A confirmation modal appears showing both questions. Confirm the merge. The old question disappears from the main list. Its text is preserved inside the new question as a strikethrough line with a small arrow indicator showing it is a predecessor. To restore it as an independent question, right-click the strikethrough line and select the restore option.
Example: "How do I get the selected object in Cinema 4D?" becomes obsolete once you learn there are two methods. Drag it onto "When do I use GetActiveObject() vs GetActiveObjects()?" and the original is preserved as a strikethrough ancestor inside the sharper question.
Dependency chains
If one question cannot be understood until another is clear, you can link them in a sequence. Open a question's Deep Dive panel and scroll to the "This depends on" section near the top.
Click it to open a search field. Type part of any other question's text and select it from the list that appears. Once linked, both questions show a small chain badge: position 1 means it should be learned first, 2 means it depends on something, and higher numbers extend the chain. Use this to make learning order explicit when your questions have a genuine prerequisite structure.
The Stuck indicator
If a question is genuinely blocking you, open its Deep Dive panel and look at the "Feeling Blocked?" section at the bottom.
Three options appear: Missing Something (you lack a prerequisite or resource), I Don't Get It (it makes no sense yet), or Not Confident Using It (you understand it but would probably apply it wrong). Click the one that matches. It highlights in red. A red dot appears on the question row. The parent topic card also shows a red dot in its corner. To clear the stuck status, open Deep Dive again and click the active option to toggle it off.
Quiz Mistakes
Quiz Mistakes is a flashcard-style review mode built entirely from mistakes you log yourself inside individual Deep Dive panels. Here is the full workflow.
Adding quiz questions (inside Deep Dive): Open any question's Deep Dive panel and scroll to the Mistakes section. Below the personal mistakes list there is an "Add to Mistake Quiz" area. Click "+ Add your question" and type a quiz question designed to catch that mistake again, for example "What does GetActiveObject() return when three objects are selected?" Add as many as you want across different questions. Each one is stored against the question it came from.
Running the quiz: Click the "Quiz Mistakes" button in the Questions header. The panel opens. If you have quiz questions, one appears at random. Try to answer it mentally. Click "Show context" to reveal the original question it came from. Click "Next question" to move to the next one. The quiz cycles through all active questions in random order.
Managing the quiz: Click "Manage" in the Quiz panel header to enter manage mode. Here you see two controls. First, a topic filter list with checkboxes: unchecking a topic removes all of its quiz questions from the active rotation. Second, an individual question list where you can uncheck specific quiz questions to disable them without deleting them. Click "Done" to return to quiz mode. Only the active (checked) questions will appear in the rotation.
Confusing Terms
Confusing Terms captures words and phrases that keep interrupting your understanding as you write. It is not a glossary you build manually.
How to add a term: Open any question's Deep Dive panel. In the "My current understanding" rich text editor, type or paste your notes. Select any word or phrase that confuses you. In the formatting toolbar above the editor, click the "Confusing term" button on the right side. The selected text is saved immediately and a toast notification confirms it. If you flag the same term three or more times, the toast offers a direct shortcut to create a question for it.
Viewing and acting on terms: Click the "Confusing terms" button in the Questions header (it shows a count badge when terms exist). The drawer opens listing every saved term. Terms flagged more than once show a count badge. Each term has three action buttons: "+ Question" opens the add question modal to create a question about that term, "+ Topic" opens the add topic modal to create a topic for it, and the X button deletes the term. Use this list regularly to convert accumulated confusion into concrete questions and topics.
Test Your Understanding
Reaching "I Can Explain It" means you can describe the answer. That is not the same as owning it. Owning it means knowing when to use it, where it fails, what mistakes you are likely to make, and whether you have actually applied it in the real world. The six depth checks close that gap.
The checks live in two places. The six depth columns on every question row let you tick checks at a glance across your entire question list. The Deep Dive panel gives you a writing space for each check with prompts. Both update the same state.
Using the depth columns on the question row
Each question row has six small square cells on the far right, one per check. Click any cell to tick it. A ticked cell turns teal (amber for Apply). Click it again to untick. To write a note for a check without opening Deep Dive, hover over any cell and click the small pencil icon that appears. A compact note panel slides up from the bottom of the screen with the prompt for that check visible above a text area. Write your notes and close the panel. The note is saved against that specific check for that question.
Using the Deep Dive panel
Click "Deep Dive" on any question row to open its full study panel on the right. Drag the panel's left edge to resize it. While a panel is open, press the up and down arrow keys to move to the previous or next question in the list without closing and reopening. Each depth check appears as a collapsible section. Click the section header to expand it. Prompts appear above a text area where you write your answer. Aim for 1 to 4 lines. If your answer is several paragraphs, you are writing notes, not interrogating your understanding. Click the checkbox on the right of the header to mark the section complete. The header turns teal to confirm.
The six depth checks
The Advance button and stage gate
At the bottom of the Deep Dive panel is an Advance button. It is greyed out and locked until at least two depth checks are complete. The gate only applies to the final step from "I Can Explain It" to "I Can Use It". If you click the stage dot on the question row directly, the same gate applies and a tooltip explains that you need to open Deep Dive and complete two checks first.
If you have personal mistakes logged under the Mistakes check that are not yet marked as resolved, the app shows a modal before advancing. It lists the unresolved mistakes and asks whether you are past them. You can confirm and advance anyway, or go back and resolve them first.
Sources
At the top of each Deep Dive panel is a Sources section. Click "+ Add source" to add a reference. Each source entry has two parts: a type tag and a text field. The type tag is a dropdown with options including Book, Article, Video, Course, Documentation, Person, and Podcast. Select "+ Add type..." to create a custom tag that will then be available for all other sources. The text field holds the title, URL, or name. Each source also has two checkboxes: "Confirmed" (you found a usable answer there) and "Not found" (you checked and it was not useful). These let you track which resources actually answered the question so you can reference them again later and know which to skip.
My current understanding
Below Sources is a rich text editor labelled "My current understanding". This is a free-form space for your own sense-making notes on this question. Write what you believe in your own words. Update it as your understanding changes. The formatting toolbar above the editor includes bold, italic, underline, lists, code toggle, and five highlight colours. The "Confusing term" button on the right of the toolbar saves any text you have selected as a confusing term without leaving the panel. The editor content is not a summary of your sources. It is your active thinking about the answer.
How Everything Connects
The three sections communicate automatically. You never need to manually update the Topic Board based on what you do in Questions.
Learning Python inside Cinema 4D
You create a new subject called "Python in Cinema 4D". You click "+ Add topic" five times: Selecting objects, Traversing the object hierarchy, Creating and inserting new objects, Getting and setting object properties, Tags and their methods. All land in Uncategorised.
Selecting objects · Traversing the object hierarchy · Creating and inserting new objects · Getting and setting object properties · Tags and their methods
After reading, you drag "Selecting objects" into Core / Foundational. You drag "Traversing the object hierarchy" into Important Detail. You Ctrl+click both cards, choose "Requires" from the connection type dropdown, and type "You must be able to select an object before traversing from it." You click "Add connection". A curved arrow appears between the two cards labelled "R".
You click "+ Add question" and type "How do I get the currently selected object?" You click the "Selecting objects" topic button to link it. It lands at Unknown.
After studying you find two methods: GetActiveObject() and GetActiveObjects(). The original question is now too vague. You add a sharper one: "When do I use GetActiveObject() vs GetActiveObjects()?" You then drag the old question onto the new one. The confirmation modal appears. You confirm. The old question's text appears as a strikethrough inside the new one.
You advance the merged question to I Can Explain It and click Deep Dive.
Limits: You write "Both return None or an empty list if nothing is selected. Without a None check, the script crashes silently." You tick the Limits checkbox. It turns teal.
Mistakes: In the text area you write "Using GetActiveObject() when the user has multiple objects selected." You click "+ Add my mistake" and write "I used GetActiveObject() in my first real script and silently ignored two of three selected objects." You click "+ Add your question" in the quiz area and write "What does GetActiveObject() return when three objects are selected?" The Mistakes check ticks automatically because content exists.
Apply: You tick "Used to solve a real problem". Apply turns amber.
Three checks are complete. The Advance button unlocks. You click it. The question moves to I Can Use It. The strength bar on the Selecting objects topic card updates automatically.
Learning Calculus Derivatives
You create a new subject called "Calculus". You add nine topics to Uncategorised: Limits, Derivatives, Integration, Functions, Rate of Change, Chain Rule, Product Rule, Optimization, Higher Order Derivatives.
After reading, you drag Limits, Functions, Rate of Change, and Derivatives into Core / Foundational. You Ctrl+click Derivatives and Limits, choose "Requires", and type "A derivative is defined as a limit, so limits must be understood first." You Ctrl+click Derivatives and Rate of Change, choose "Results in", and type "Computing a derivative gives you the instantaneous rate of change at any point." You drag Chain Rule and Product Rule into Important Detail and draw "Supports" connections to Derivatives. You drag Optimization into Important Detail and draw "Leads to" from Derivatives.
You add your first question: "What even is a derivative?" Linked to Derivatives. Unknown. After studying you advance it to I Can Explain It. But the textbook definition still feels disconnected from anything real. You add a second question: "What does a derivative actually mean in real life, not in math language?" Unknown.
You study further. You find the car example. Distance gives speed. Speed gives acceleration. Each derivative answers the same question one level deeper. That question reaches I Can Explain It. You open Deep Dive.
Teach: You write "A derivative measures how fast something is changing at one specific moment. If you know your position over time, the derivative gives you your speed at any instant. Take the derivative of speed and you get acceleration. Each level asks: how fast is this changing right now?" You tick the Teach checkbox.
Scenario: You write "A car journey. I have a graph of distance versus time. The derivative at any point gives my speed at that exact second. If my speed is increasing, the second derivative tells me the acceleration." You tick the Scenario checkbox.
Apply: You tick "Tested on a concrete example". Apply turns amber.
Two checks complete. The Advance button unlocks. You click it. The question moves to I Can Use It. The strength bar on the Derivatives topic card updates automatically.
Writing a Custom JSON File for Import
If you already have a course outline, a syllabus, or an AI-generated topic map, you can write a JSON file by hand and import it straight into the app instead of adding everything manually. The result is identical to using the app to build the subject from scratch.
How to import: Click the gear icon in the top-right of the subject header, then select Restore. Pick your
The minimum valid file
Save the text below as
{
"_type": "dacosta-thinklab-backup",
"_version": 3,
"subject": {
"id": 1,
"name": "My Subject",
"color": "#2455a4"
},
"topics": [],
"questions": [],
"arrows": [],
"groups": []
}The
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, see values below) }, { "id": "t2", "name": "Chain Rule", "col": "detail", "slot": 0 } ]
Questions
Each object in the
"questions": [ { "id": 101, "text": "What is a derivative?", "stage": "unknown", // "unknown" | "heard" | "think" | "understood" "topicIds": ["t1"], // array of topic id strings, use [] for unlinked "stuck": false // false | "missing" | "dontget" | "notconfident" } ]
Arrows (connections between topics)
Each object in the
"arrows": [ { "id": "a1", "from": "t2", // topic id "to": "t1", // topic id "type": "requires", // see built-in types below "color": "#2455a4", "label": "Requires", // short label shown on the curve "sentence": "Chain Rule requires Derivatives first.", "direction": "forward", // "forward" | "backward" | "both" "lineStyle": "dashed" // "dashed" | "solid" | "dotted" } ]
Built-in
Groups
Groups visually cluster adjacent cards in the same column under a shared colour and label. The
"groups": [ { "id": "g1", "name": "Differentiation Rules", "color": "#1a7a60", "col": "detail", // must match the col of all member topics "topicIds": ["t2", "t3"], // must be consecutive slots in the same column "icon": "" // icon id string or empty string } ]
Complete working example
Three topics, two questions, one connection, one group. Copy this, save it as
{
"_type": "dacosta-thinklab-backup",
"_version": 3,
"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" }
],
"questions": [
{
"id": 101, "text": "What is a derivative?",
"stage": "unknown", "topicIds": ["t1"], "stuck": false
},
{
"id": 102, "text": "When do I use Chain Rule vs Product Rule?",
"stage": "unknown", "topicIds": ["t2", "t3"], "stuck": false
}
],
"arrows": [
{
"id": "a1", "from": "t2", "to": "t1",
"type": "requires", "color": "#2455a4", "label": "Requires",
"direction": "forward", "lineStyle": "dashed",
"sentence": "Chain Rule requires understanding Derivatives first."
}
],
"groups": [
{
"id": "g1", "name": "Differentiation Rules",
"color": "#1a7a60", "col": "detail",
"topicIds": ["t2", "t3"], "icon": ""
}
]
}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.