A Free Prerequisite Graph of Everything Kids Learn: Exploring Marble's os-taxonomy
If you have ever tried to build anything in education tech, you have probably hit the same wall: curriculum data is either a flat list of standards in a PDF, or it is locked inside someone's product.
A flat list tells you what a child should learn in Year 2. It does not tell you what they need to know first. And that second question is the one that matters if you are building adaptive practice, a tutoring app, a learning-path generator, or an AI tutor that needs to know where a kid is stuck.
os-taxonomy from Marble is an attempt to fix that. It is an open dataset that breaks primary and elementary learning into small, teachable ideas and connects them with prerequisite edges. It has picked up around 4.8k stars, which is a lot for a pure data repo.
Here is what is in it, how to use it, and whether it is worth your time.
What you actually get
It is a graph, shipped as plain JSON.
- 1,591 micro-topics (nodes). Each is one teachable idea, like "Building sentences" or "Apparent brightness of stars".
- 3,225 prerequisite edges. "Topic X depends on topic Y", each tagged hard or soft, with a one-line reason.
- Curriculum alignment. Topics link to the standards they came from: Common Core, NGSS, the UK National Curriculum, the C3 social studies framework, and IB PYP.
- 176 domain clusters. Short, parent-friendly summaries per subject, domain, and age band.
- Teaching research. 1,051 records on how to teach Science and Mathematics topics, with activities, feedback ideas, and assessment guidance. More on this below.
Coverage is weighted toward the core subjects:
| Subject | Topics |
| --- | --- |
| Science | 547 |
| Mathematics | 504 |
| English | 286 |
| History | 90 |
| Personal & Social Development | 88 |
| Life Skills | 37 |
| Computing | 21 |
| Learning to Learn | 18 |
There is no runtime, no package, and no dependencies. You clone the repo and read JSON files.
The data model
Everything lives in data/:
| File | Contents |
| --- | --- |
| topics.json | The micro-topics (nodes) |
| dependencies.json | Prerequisite edges |
| curriculum-standards.json | Source standards, grouped by curriculum |
| clusters.json | Domain summaries |
| teaching-research.json | Teaching guidance per topic (about 23 MB) |
| manifest.json | Counts and SHA-256 checksums |
JSON Schemas for each file are in schema/.
A topic looks like this (trimmed):
{
"id": "mt_N8CpN1EJrP",
"type": "CONCEPTUAL",
"subject": "English",
"domain": "Grammar & Punctuation",
"name": "Building sentences",
"ageRangeStart": 4,
"ageRangeEnd": 6,
"centrality": 0.257,
"evidence": [
"Distinguish between complete sentences and fragments",
"Compose a complete sentence with a subject and verb"
],
"assessmentPrompt": "If {{name}} says something like \"The dog\", can they tell you...",
"standards": ["ccss-ela:L.K.1f", "uk-nc-2013:Eng.App2.Y1.Sent.1"]
}
A few fields are worth calling out:
- type classifies the kind of knowledge: conceptual, procedural, representational, language, or meta.
- evidence is a list of observable mastery criteria. This is the useful bit for anyone building assessments.
- centrality gives you a rough sense of how connected a topic is in the graph.
- assessmentPrompt is a natural-language check with a {{name}} placeholder for the child's name. Replace or strip it before showing it to anyone.
And an edge:
{
"topicId": "mt__00ZSLnB7p",
"prerequisiteId": "mt_VBl1T1sFCM",
"strength": "hard",
"reason": "Must understand vibrations make sound before finding volume patterns"
}
Read it as "topicId depends on prerequisiteId". Flip it and you get "unlocks".
Getting started in five minutes
git clone https://github.com/withmarbleapp/os-taxonomy.git
cd os-taxonomy
node scripts/validate.mjs # checks structure, references, and checksums
Find the direct prerequisites of a topic
This uses JSON import attributes, so use a recent Node version (22 or newer is safest):
import topics from './data/topics.json' with { type: 'json' };
import deps from './data/dependencies.json' with { type: 'json' };
const byId = new Map(topics.topics.map(t => [t.id, t]));
const prereqsOf = id =>
deps.dependencies
.filter(d => d.topicId === id)
.map(d => byId.get(d.prerequisiteId));
// "Addition and subtraction word problems"
console.log(prereqsOf('mt_yJmvUCCym7').map(t => t.name));
// [ 'Representing Addition and Subtraction' ]
Build a full learning path
The interesting thing about a prerequisite graph is that you can walk it. Since the graph is a DAG (no cycles), a depth-first walk gives you every topic a learner needs before the target, in an order they could actually study them:
const edgesByTopic = new Map();
for (const d of deps.dependencies) {
if (!edgesByTopic.has(d.topicId)) edgesByTopic.set(d.topicId, []);
edgesByTopic.get(d.topicId).push(d);
}
function learningPath(targetId, { hardOnly = true } = {}) {
const seen = new Set();
const order = [];
function visit(id) {
if (seen.has(id)) return;
seen.add(id);
for (const d of edgesByTopic.get(id) ?? []) {
if (hardOnly && d.strength !== 'hard') continue;
visit(d.prerequisiteId);
}
order.push(byId.get(id));
}
visit(targetId);
return order; // prerequisites first, target last
}
for (const t of learningPath('mt_yJmvUCCym7')) {
console.log(`${t.ageRangeStart}-${t.ageRangeEnd} ${t.subject} ${t.name}`);
}
Running it on "Addition and subtraction word problems" prints:
4-6 Mathematics One-to-one counting
4-6 Mathematics How Many in Total?
4-6 Mathematics Addition as combining or putting together two
4-6 Mathematics Subtraction as taking away or separating
4-6 Mathematics Representing Addition and Subtraction
4-6 Mathematics Addition and subtraction word problems
That is a sensible sequence: count, combine, take away, represent it, then solve word problems.
The hardOnly flag is handy. Hard edges are true blockers. Soft edges are "helpful to know", so include them when you want a gentler path and drop them when you want the shortest one.
Prefer Python?
Same idea with networkx:
import json
import networkx as nx
topics = {t["id"]: t for t in json.load(open("data/topics.json"))["topics"]}
deps = json.load(open("data/dependencies.json"))["dependencies"]
G = nx.DiGraph()
for d in deps:
G.add_edge(d["prerequisiteId"], d["topicId"], strength=d["strength"])
target = "mt_yJmvUCCym7"
needed = nx.ancestors(G, target) | {target}
path = list(nx.topological_sort(G.subgraph(needed)))
for tid in path:
print(topics[tid]["name"])
Once it is in networkx, you also get the usual graph tools for free: finding the most "foundational" topics, spotting bottlenecks, or checking which topics unlock the most downstream learning. Note that this version follows soft edges too, so it can return a longer path than the JavaScript one.
Add the teaching guidance
The newest file, teaching-research.json, covers what to do with a topic. Each record joins to a topic by topicId and includes a teaching summary, concrete activities with feedback ideas, common misconceptions, assessment guidance, and sources.
import research from './data/teaching-research.json' with { type: 'json' };
const guidanceByTopic = new Map(research.records.map(r => [r.topicId, r]));
const guidance = guidanceByTopic.get('mt_yJmvUCCym7');
console.log(guidance?.learn.summary);
for (const a of guidance?.learn.activities ?? []) console.log('-', a.title);
// - Story-modelling with counters and a mat
// ...
Only Science and Mathematics are covered so far. For English and the other subjects, guidance will be undefined, so keep that ?. in place.
What you could build with it
- Adaptive practice. When a kid fails a topic, walk back one hard edge and test the prerequisite instead of repeating the same question.
- AI tutors. Give an LLM the topic, its evidence list, its prerequisites, and (for maths and science) its teaching activities as structured context. That grounds the model far better than "teach my kid fractions".
- Placement and diagnostics. Use evidence and assessmentPrompt to build quick checks, then use the graph to infer what a child probably already knows.
- Curriculum mapping. Because topics link to both Common Core and the UK National Curriculum, you can roughly map content between the two systems.
- Visualizations. The repo includes a 3D graph render, and Marble has an interactive version where you can click a topic and see everything that leads to it.
The caveats, honestly
The licensing needs a careful read. This is the most important part. The dataset has three layers with different terms:
- The database (structure, IDs, relationships) is under ODbL 1.0.
- Marble's written text (names, descriptions, evidence, prompts, reasons) is under CC BY-SA 4.0.
- curriculum-standards.json is not Marble's to license. Each source keeps its upstream terms.
So, is it worth a try?
If you work anywhere near education tech, yes. It takes minutes to load, and a well-structured prerequisite graph with mastery criteria is the kind of thing teams usually spend months building internally. Even if you do not use it as-is, it is a good reference model for how to structure learning data.
It is especially useful as grounding data for AI tutoring tools, where the hard problem is often not generating explanations but knowing what to teach next.
Just read the license section before shipping anything commercial, and treat v1 as a strong foundation that you validate, not a finished curriculum.
A good first experiment: pick a topic your own kid (or a niece, nephew, or student) is struggling with, run learningPath() on it, and see whether the prerequisites match what you see in real life.
Links
- Repository: withmarbleapp/os-taxonomy
5 reactions
Mentions
An open, structured taxonomy of what children learn across the primary years
Everything: We're rebuilding; MacNativeGames; Os Taxonomy | GitHub Daily | 2026-10-21 Chapters: 00:00 Everything - GitHub Daily 00:07 #1 Everything 00:20 #2 MacNativeGames 00:37 #3 Os Taxonomy GitHub Daily reads the OpenGithubs archive as a ranked board with one compact card per repository. The daily snapshot keeps rank, total stars, daily growth, weekly growth, monthly growth, created date, and description in the evidence record. Each visible repo card is compressed to rank, signal, why it matters, and next check; archive and repository URLs remain in the ledger. Board movement is an observed signal rather than an endorsement, so verify upstream documentation, license, release, and issue health before adoption. Published: 2026-10-21 Cadence: daily Archive page: github.com/OpenGithubs/github-daily-rank/blob/mai… Archive raw file: raw.githubusercontent.com Board date: 2026.10.21 Selected repository rows: - #1 Everything · +376 today · 3,531 total · JavaScript · · Rebuilt, open-sourced, and MIT-licensed · HeyPuter/everything - #2 MacNativeGames · +984 today · 4,162 total · C · MacNativeGames English Breath of the Wild 1.6.0 is · ly05010419/MacNativeGames - #3 Os Taxonomy · +421 today · 7,125 total · JavaScript · No description was provided on the repository page · withmarbleapp/os-taxonomy Sources used: - OpenGithubs daily rank archive - GitHub repo pages - GitHub repo API Chapters: 00:00 Everything - GitHub Daily 00:07 Everything - #1 00:20 MacNativeGames - #2 00:37 Os Taxonomy - #3 00:53 Next refresh - Everything 01:00 Full disclaimer - Disclaimer Top comment prompt: Watch whether Everything stays on top or whether a new repo takes over next refresh. Source ledger: Direct source URLs: - github.com/OpenGithubs/github-daily-rank/blob/mai… - raw.githubusercontent.com - api.github.com - github.com/HeyPuter/everything/blob/main/README.md - github.com/HeyPuter/everything/commit/75f6dcee6ef… - HeyPuter/everything - github.com/HeyPuter/everything/releases - github.com/HeyPuter/everything/commit/06b3fc8ed7e… - api.github.com - github.com/ly05010419/MacNativeGames/blob/main/RE… - github.com/ly05010419/MacNativeGames/commit/5f753… - ly05010419/MacNativeGames - github.com/ly05010419/MacNativeGames/releases - github.com/ly05010419/MacNativeGames/commit/7305d… - api.github.com - github.com/withmarbleapp/os-taxonomy/blob/main/RE… - github.com/withmarbleapp/os-taxonomy/commit/e0d38… - withmarbleapp/os-taxonomy - github.com/withmarbleapp/os-taxonomy/releases - github.com/withmarbleapp/os-taxonomy/commit/3de50… Informational and educational purposes only. Not investment advice, product endorsement, or professional guidance. Subscriber reason: Subscribe for the daily AI, GitHub, and market board. Tomorrow watchlist: Tomorrow, compare the next top-10 rank refresh and check whether the lead repo keeps velocity.
子どもの学習内容を細かなトピックと前提条件のグラフ構造にまとめたオープンデータツールっぽい 教育アプリや個別学習のカリキュラム設計に使えそうかな yug1224 starred withmarbleapp/os-taxonomy withmarbleapp/os-taxonomy
Marble open-sourced a prerequisite graph of what kids learn in primary school: 1,590 concepts, 3,221 dependencies at the July release (US/UK standards, JSON, ODbL/CC BY-SA). Next step: playable experiments, starting with a Water Lab on heat and water. withmarbleapp/os-taxonomy t.co
初等教育で学ぶ内容を細かな学習項目に分け、前提知識と教育課程の基準につないだデータセット。教材開発者や教育関係者が、学ぶ順序や理解の確認方法を構造的に扱うための資料。 withmarbleapp/os-taxonomy 【機能・リポジトリ内容】 ・学習項目:v1は8教科・1,590項目。説明、概念などの種別、教科・領域、目安年齢、習得の証拠を収録。 ・前提関係:3,221本の依存関係を有向非巡回グラフとして収録。強い・弱い前提の区分と理由を付与。 ・教育課程との対応:NGSS、Common Core、英国National Curriculumなどの基準へ学習項目を関連付ける。 ・保護者向け説明:教科・領域・年齢帯ごとの183件の要約を収録。 ・機械可読形式:UTF-8 JSON、JSON Schema、件数・SHA-256チェックサムを持つmanifestを提供。 【導入条件・制約】 ・利用方法:純粋なデータとしてJSONを読み込む方式。専用ランタイムや依存ライブラリは不要との説明。 ・事前準備:表示や探索機能は利用側で実装。確認用プロンプトの{{name}}は置換または削除が必要。 ・対応範囲:8教科を対象とするv1。日本の学習指導要領への対応や、教育効果の検証結果は取得資料では確認できない。 ・データライセンス:データベース構造・ID・関係はODbL 1.0。Marble作成の名称・説明・評価文などはCC BY-SA 4.0。 ・第三者資料:教育課程の基準本文は元資料の条件に従う。帰属表示と、該当する継承条件の確認が必要。 ・費用・非収録情報:研究・商用利用を認める説明あり。埋め込みベクトルや児童・利用者個人のデータは含まない。 【活用案】 ・補習内容の選定:教員がつまずいた単元から前提項目を逆にたどり、復習範囲を検討する。児童の理解度確認は別途必要。 ・教材ナビゲーション:教材開発者が前提グラフを使い、次に学べる内容を示す画面を実装する。 ・家庭学習の説明:保護者向けサービスが領域別要約と目安年齢を表示し、学習内容を分かりやすく伝える。 ・教育課程の比較:教育研究者が項目と基準の対応を整理し、複数教育課程の共通点や違いを分析する。 ・理解確認ツールの試作:開発者が習得基準と評価用プロンプトを使い、教員が確認・修正する前提でチェックリストを作る。
开源热榜 10.20:八个老项目吃掉九成星,今天这榜是续聘名单 开源热榜 10.20:八个老项目吃掉九成星,今天这榜是续聘名单 本期数据来自 GitHub 每日热榜(github.com/trending?since=daily), 统计口径是当天新增星标,不是总 star 数。数据抓取时间:2026-10-20。 本期榜单 1 · MadsLorentzen/ai-job-search · Python · +3,856 MadsLorentzen/ai-job-search 2 · stablyai/orca · TypeScript · +1,590 stablyai/orca 3 · anomalyco/opencode · TypeScript · +1,311 anomalyco/opencode 4 · Comfy-Org/ComfyUI · Python · +1,011 Comfy-Org/ComfyUI 5 · akitaonrails/ai-memory · Rust · +666 akitaonrails/ai-memory 6 · HKUDS/CLI-Anything · Python · +606 HKUDS/CLI-Anything 7 · ruvnet/ruflo · TypeScript · +564 ruvnet/ruflo 8 · Kruk2/jasna · Python · +498 Kruk2/jasna 9 · shiyu-coder/Kronos · Python · +363 shiyu-coder/Kronos 10 · headroomlabs-ai/headroom · Python · +310 headroomlabs-ai/headroom 11 · withmarbleapp/os-taxonomy · JavaScript · +284 withmarbleapp/os-taxonomy 12 · anthropics/claude-code · TypeScript · +167 anthropics/claude-code 前八名今天一共新增 +11,226 星。 章节 0:00 八个老员工 四个新来的 0:28 10 月 20 日 新增 11226 0:36 八个老项目 各换一个新角度 3:32 K 线 压缩 考纲 官方本体 5:01 老项目卖开箱即用 新项目卖底子 关于这条视频 画面全部由本机流水线生成,没有使用任何付费生成服务: - 榜单数据:GitHub 每日热榜页面(快照留档) - 仓库卡与头像:GitHub 官方 OpenGraph 卡片(真素材) - 文档引用:各仓库 README 原文(橙色荧光笔扫的是原话) - 插画素材:本机 ComfyUI + Qwen-Image 2.1 生成(只承担比喻与笑点) - 配音:本机 IndexTTS 2.5 零样本克隆;词级时间戳用 Whisper 对齐 - 音乐:本机 ComfyUI + MiniMax Music 3 - 画面合成:open-edits 的 fireship 引擎逐帧绘制 + ffmpeg 合并 说明 星标是收藏,不是质量评分;热榜只看 24 小时增量,昨天第一今天可能排在五十名开外。 榜单口径与排名以 GitHub 页面为准。
GitHub趋势:今天这仨真跨界 金融大模型、儿童知识图谱、破甲工具——今天这仨真跨界。 先看 withmarbleapp/os-taxonomy,儿童学习的知识图谱,一千五百多个微主题织成依赖网络,对齐多国课标,学习路径一目了然,单日涨星 301。 再看 shiyu-coder/Kronos,专读金融市场的语言大模型,把行情研报当母语学,预测建模一把好手,单日涨星 355。 最后看 YuJunZhiXue/dsh-purge,DeepSeek 破甲工具箱,各家模型都能破,提示词还能按模型换着来,作者求 star 收藏。 跨界跨到你心坎了吗? #GitHub热门 #程序员 #开源 #AI #科技 #GitHub趋势 本期项目地址: - os-taxonomy: withmarbleapp/os-taxonomy - Kronos: shiyu-coder/Kronos - dsh-purge: YuJunZhiXue/dsh-purge 背景音乐:Kevin MacLeod《Chill》,CC BY 3.0授权 #GitHub热门 #程序员 #开源 #AI #科技 #GitHub趋势
一天暴漲 3856 星!ai-job-search 讓 Claude 幫你找工作 今日 GitHub 熱門前五:AI 求職框架衝單日近四千星、多代理編排器 orca、金融 K 線基礎模型 Kronos、Token 壓縮神器 headroom、教學知識圖譜 os-taxonomy。 1|ai-job-search:AI 求職框架 MadsLorentzen/ai-job-search 2|orca:AI 編排器 stablyai/orca 3|Kronos:金融基礎模型 shiyu-coder/Kronos 4|headroom:Token 壓縮工具 headroomlabs-ai/headroom 5|os-taxonomy:教學分類體系 withmarbleapp/os-taxonomy 資料來源:GitHub Trending(今日新增 star) 每天幫你篩一遍 GitHub 開源熱榜。 排名依 GitHub Trending 當日新增 star 數,僅供參考,不代表推薦或背書。 #GitHub #開源 #程式設計 #開源專案 #GitHubTrending #軟體開發 #aijobsearch #Python #TypeScript #GitHub熱榜 #AI求職 #多代理編排 #Shorts
GitHub - withmarbleapp/os-taxonomy withmarbleapp/os-taxonomy Contribute to withmarbleapp/os-taxonomy development by creating an account on GitHub. Join our developer community on Discord: discord.gg
A Free Prerequisite Graph of Everything Kids Learn: Exploring Marble's os-taxonomy If you have ever tried to build anything in education tech, you have probably hit the same wall: curriculum data is either a flat list of standards in a PDF, or it is locked inside someone's product. A flat list tells you what a child should learn in Year 2. It does not tell you what they need to know first. And that second question is the one that matters if you are building adaptive practice, a tutoring app, a learning-path generator, or an AI tutor that needs to know where a kid is stuck. os-taxonomy from Marble is an attempt to fix that. It is an open dataset that breaks primary and elementary learning into small, teachable ideas and connects them with prerequisite edges. It has picked up around 4.8k stars, which is a lot for a pure data repo. Here is what is in it, how to use it, and whether it is worth your time. What you actually get It is a graph, shipped as plain JSON. - 1,591 micro-topics (nodes). Each is one teachable idea, like "Building sentences" or "Apparent brightness of stars". - 3,225 prerequisite edges. "Topic X depends on topic Y", each tagged hard or soft, with a one-line reason. - Curriculum alignment. Topics link to the standards they came from: Common Core, NGSS, the UK National Curriculum, the C3 social studies framework, and IB PYP. - 176 domain clusters. Short, parent-friendly summaries per subject, domain, and age band. - Teaching research. 1,051 records on how to teach Science and Mathematics topics, with activities, feedback ideas, and assessment guidance. More on this below. Coverage is weighted toward the core subjects: | Subject | Topics | | --- | --- | | Science | 547 | | Mathematics | 504 | | English | 286 | | History | 90 | | Personal & Social Development | 88 | | Life Skills | 37 | | Computing | 21 | | Learning to Learn | 18 | There is no runtime, no package, and no dependencies. You clone the repo and read JSON files. The data model Everything lives in data/: | File | Contents | | --- | --- | | topics.json | The micro-topics (nodes) | | dependencies.json | Prerequisite edges | | curriculum-standards.json | Source standards, grouped by curriculum | | clusters.json | Domain summaries | | teaching-research.json | Teaching guidance per topic (about 23 MB) | | manifest.json | Counts and SHA-256 checksums | JSON Schemas for each file are in schema/. A topic looks like this (trimmed): { "id": "mt_N8CpN1EJrP", "type": "CONCEPTUAL", "subject": "English", "domain": "Grammar & Punctuation", "name": "Building sentences", "ageRangeStart": 4, "ageRangeEnd": 6, "centrality": 0.257, "evidence": [ "Distinguish between complete sentences and fragments", "Compose a complete sentence with a subject and verb" ], "assessmentPrompt": "If {{name}} says something like \"The dog\", can they tell you...", "standards": ["ccss-ela:L.K.1f", "uk-nc-2013:Eng.App2.Y1.Sent.1"] } A few fields are worth calling out: - type classifies the kind of knowledge: conceptual, procedural, representational, language, or meta. - evidence is a list of observable mastery criteria. This is the useful bit for anyone building assessments. - centrality gives you a rough sense of how connected a topic is in the graph. - assessmentPrompt is a natural-language check with a {{name}} placeholder for the child's name. Replace or strip it before showing it to anyone. And an edge: { "topicId": "mt__00ZSLnB7p", "prerequisiteId": "mt_VBl1T1sFCM", "strength": "hard", "reason": "Must understand vibrations make sound before finding volume patterns" } Read it as "topicId depends on prerequisiteId". Flip it and you get "unlocks". Getting started in five minutes git clone https://github.com/withmarbleapp/os-taxonomy.git cd os-taxonomy node scripts/validate.mjs # checks structure, references, and checksums Find the direct prerequisites of a topic This uses JSON import attributes, so use a recent Node version (22 or newer is safest): import topics from './data/topics.json' with { type: 'json' }; import deps from './data/dependencies.json' with { type: 'json' }; const byId = new Map(topics.topics.map(t => [t.id, t])); const prereqsOf = id => deps.dependencies .filter(d => d.topicId === id) .map(d => byId.get(d.prerequisiteId)); // "Addition and subtraction word problems" console.log(prereqsOf('mt_yJmvUCCym7').map(t => t.name)); // [ 'Representing Addition and Subtraction' ] Build a full learning path The interesting thing about a prerequisite graph is that you can walk it. Since the graph is a DAG (no cycles), a depth-first walk gives you every topic a learner needs before the target, in an order they could actually study them: const edgesByTopic = new Map(); for (const d of deps.dependencies) { if (!edgesByTopic.has(d.topicId)) edgesByTopic.set(d.topicId, []); edgesByTopic.get(d.topicId).push(d); } function learningPath(targetId, { hardOnly = true } = {}) { const seen = new Set(); const order = []; function visit(id) { if (seen.has(id)) return; seen.add(id); for (const d of edgesByTopic.get(id) ?? []) { if (hardOnly && d.strength !== 'hard') continue; visit(d.prerequisiteId); } order.push(byId.get(id)); } visit(targetId); return order; // prerequisites first, target last } for (const t of learningPath('mt_yJmvUCCym7')) { console.log(`${t.ageRangeStart}-${t.ageRangeEnd} ${t.subject} ${t.name}`); } Running it on "Addition and subtraction word problems" prints: 4-6 Mathematics One-to-one counting 4-6 Mathematics How Many in Total? 4-6 Mathematics Addition as combining or putting together two 4-6 Mathematics Subtraction as taking away or separating 4-6 Mathematics Representing Addition and Subtraction 4-6 Mathematics Addition and subtraction word problems That is a sensible sequence: count, combine, take away, represent it, then solve word problems. The hardOnly flag is handy. Hard edges are true blockers. Soft edges are "helpful to know", so include them when you want a gentler path and drop them when you want the shortest one. Prefer Python? Same idea with networkx: import json import networkx as nx topics = {t["id"]: t for t in json.load(open("data/topics.json"))["topics"]} deps = json.load(open("data/dependencies.json"))["dependencies"] G = nx.DiGraph() for d in deps: G.add_edge(d["prerequisiteId"], d["topicId"], strength=d["strength"]) target = "mt_yJmvUCCym7" needed = nx.ancestors(G, target) | {target} path = list(nx.topological_sort(G.subgraph(needed))) for tid in path: print(topics[tid]["name"]) Once it is in networkx, you also get the usual graph tools for free: finding the most "foundational" topics, spotting bottlenecks, or checking which topics unlock the most downstream learning. Note that this version follows soft edges too, so it can return a longer path than the JavaScript one. Add the teaching guidance The newest file, teaching-research.json, covers what to do with a topic. Each record joins to a topic by topicId and includes a teaching summary, concrete activities with feedback ideas, common misconceptions, assessment guidance, and sources. import research from './data/teaching-research.json' with { type: 'json' }; const guidanceByTopic = new Map(research.records.map(r => [r.topicId, r])); const guidance = guidanceByTopic.get('mt_yJmvUCCym7'); console.log(guidance?.learn.summary); for (const a of guidance?.learn.activities ?? []) console.log('-', a.title); // - Story-modelling with counters and a mat // ... Only Science and Mathematics are covered so far. For English and the other subjects, guidance will be undefined, so keep that ?. in place. What you could build with it - Adaptive practice. When a kid fails a topic, walk back one hard edge and test the prerequisite instead of repeating the same question. - AI tutors. Give an LLM the topic, its evidence list, its prerequisites, and (for maths and science) its teaching activities as structured context. That grounds the model far better than "teach my kid fractions". - Placement and diagnostics. Use evidence and assessmentPrompt to build quick checks, then use the graph to infer what a child probably already knows. - Curriculum mapping. Because topics link to both Common Core and the UK National Curriculum, you can roughly map content between the two systems. - Visualizations. The repo includes a 3D graph render, and Marble has an interactive version where you can click a topic and see everything that leads to it. The caveats, honestly The licensing needs a careful read. This is the most important part. The dataset has three layers with different terms: - The database (structure, IDs, relationships) is under ODbL 1.0. - Marble's written text (names, descriptions, evidence, prompts, reasons) is under CC BY-SA 4.0. - curriculum-standards.json is not Marble's to license. Each source keeps its upstream terms. So, is it worth a try? If you work anywhere near education tech, yes. It takes minutes to load, and a well-structured prerequisite graph with mastery criteria is the kind of thing teams usually spend months building internally. Even if you do not use it as-is, it is a good reference model for how to structure learning data. It is especially useful as grounding data for AI tutoring tools, where the hard problem is often not generating explanations but knowing what to teach next. Just read the license section before shipping anything commercial, and treat v1 as a strong foundation that you validate, not a finished curriculum. A good first experiment: pick a topic your own kid (or a niece, nephew, or student) is struggling with, run learningPath() on it, and see whether the prerequisites match what you see in real life. Links - Repository: withmarbleapp/os-taxonomy