[
  {
    "slug": "search-pathfinding",
    "icon": "🧭",
    "category": "search",
    "category_en": "Search",
    "category_zh": "搜索",
    "title": "Pathfinding Visualizer",
    "title_zh": "寻路可视化",
    "desc": "Compare breadth-first search (BFS), depth-first search (DFS), Dijkstra’s algorithm, and A* on the same grid.",
    "desc_zh": "在同一网格上比较广度优先搜索（BFS）、深度优先搜索（DFS）、Dijkstra 算法和 A*。",
    "time": "20 min",
    "level": "start",
    "featured": "Race A* against BFS on the same weighted maze.",
    "featured_zh": "让 A* 与 BFS 在同一个加权迷宫中竞速。",
    "accent": "#2563eb",
    "course_order": 1,
    "showcase_order": 1,
    "course_phase": "Search and problem solving",
    "accent_name": "Cobalt"
  },
  {
    "slug": "bayes-classifier",
    "icon": "🎯",
    "category": "probability",
    "category_en": "Probability",
    "category_zh": "概率",
    "title": "Bayes Rule Playground",
    "title_zh": "贝叶斯定理演练场",
    "desc": "Change the base rate and test quality to see why high accuracy can still produce a surprising posterior.",
    "desc_zh": "改变基率和检测质量，观察高准确率为什么仍会产生意外的后验概率。",
    "time": "20 min",
    "level": "start",
    "featured": "Compare the same test under rare and common conditions.",
    "featured_zh": "比较同一检测在罕见和常见条件下的结果。",
    "accent": "#a21caf",
    "course_order": 5,
    "showcase_order": 2,
    "course_phase": "Probability",
    "accent_name": "Fuchsia"
  },
  {
    "slug": "overfitting",
    "icon": "📈",
    "category": "ml",
    "category_en": "Model evaluation",
    "category_zh": "模型评估",
    "title": "Overfitting Explorer",
    "title_zh": "过拟合探索器",
    "desc": "Raise model complexity and compare training error with test error on fresh samples.",
    "desc_zh": "提高模型复杂度，并比较训练误差与新样本上的测试误差。",
    "time": "25 min",
    "level": "start",
    "featured": "Find the point where a better fit becomes a worse model.",
    "featured_zh": "找到拟合更好却模型更差的转折点。",
    "accent": "#047857",
    "course_order": 8,
    "showcase_order": 3,
    "course_phase": "Machine learning and evaluation",
    "accent_name": "Emerald"
  },
  {
    "slug": "q-learning-gridworld",
    "icon": "🤖",
    "category": "rl",
    "category_en": "Reinforcement learning",
    "category_zh": "强化学习",
    "title": "Q-Learning Gridworld",
    "title_zh": "Q 学习网格世界",
    "desc": "Train by trial and error, inspect value backups, and compare exploration schedules on the same world.",
    "desc_zh": "通过试错训练，检查价值回传，并在同一世界上比较探索策略。",
    "time": "30 min",
    "level": "advanced",
    "featured": "Compare an early policy with one learned from longer experience.",
    "featured_zh": "比较早期策略与经过更长经验学习的策略。",
    "accent": "#b91c1c",
    "course_order": 12,
    "showcase_order": 4,
    "course_phase": "Reinforcement learning",
    "accent_name": "Crimson"
  },
  {
    "slug": "wumpus-world",
    "icon": "🕳️",
    "category": "logic",
    "category_en": "Logical agents",
    "category_zh": "逻辑智能体",
    "title": "Wumpus World",
    "title_zh": "Wumpus 世界",
    "desc": "Follow a logical agent as percepts become safe-cell conclusions, unresolved risks, and forced choices.",
    "desc_zh": "观察逻辑智能体如何把感知转化为安全结论、未解决风险和被迫选择。",
    "time": "25 min",
    "level": "core",
    "featured": "Separate a square that is unknown from one proven safe.",
    "featured_zh": "区分未知格子与已证明安全的格子。",
    "accent": "#c2410c",
    "course_order": 3,
    "showcase_order": 5,
    "course_phase": "Logic and knowledge",
    "accent_name": "Burnt orange"
  },
  {
    "slug": "cnf-sat",
    "icon": "🧩",
    "category": "logic",
    "category_en": "Logic and SAT",
    "category_zh": "逻辑与 SAT",
    "title": "CNF and SAT Builder",
    "title_zh": "CNF 与 SAT 构建器",
    "desc": "Rewrite propositions into conjunctive normal form (CNF), then watch a satisfiability solver prune assignments.",
    "desc_zh": "把命题改写为合取范式（CNF），再观察可满足性求解器如何剪枝赋值。",
    "time": "25 min",
    "level": "core",
    "featured": "Compare a satisfiable formula with a forced contradiction.",
    "featured_zh": "比较一个可满足公式与一个必然矛盾。",
    "accent": "#6d28d9",
    "course_order": 4,
    "showcase_order": 6,
    "course_phase": "Logic and knowledge",
    "accent_name": "Violet"
  },
  {
    "slug": "bayes-network",
    "icon": "🔗",
    "category": "probability",
    "category_en": "Probabilistic inference",
    "category_zh": "概率推理",
    "title": "Bayesian Network",
    "title_zh": "贝叶斯网络",
    "desc": "Edit evidence, compare exact inference with sampling, and see explaining away in a causal graph.",
    "desc_zh": "编辑证据，比较精确推理与采样，并在因果图中观察解释消除。",
    "time": "30 min",
    "level": "core",
    "featured": "Observe how evidence for one cause can lower belief in another.",
    "featured_zh": "观察一个原因的证据如何降低对另一个原因的信念。",
    "accent": "#0f766e",
    "course_order": 6,
    "showcase_order": 7,
    "course_phase": "Probabilistic reasoning",
    "accent_name": "Teal"
  },
  {
    "slug": "knn-classifier",
    "icon": "🗳️",
    "category": "ml",
    "category_en": "Classification",
    "category_zh": "分类",
    "title": "K-Nearest Neighbors",
    "title_zh": "K 最近邻",
    "desc": "Move a query point, change k and vote weighting, and inspect every neighbor that determines the class.",
    "desc_zh": "移动查询点，改变 k 和投票权重，并检查决定类别的每个邻居。",
    "time": "20 min",
    "level": "start",
    "featured": "Compare k=1 with a larger vote near a noisy boundary.",
    "featured_zh": "在有噪声的边界附近比较 k=1 与更大的投票范围。",
    "accent": "#be123c",
    "course_order": 7,
    "showcase_order": 8,
    "course_phase": "Machine learning",
    "accent_name": "Rose"
  },
  {
    "slug": "hill-climbing",
    "icon": "⛰️",
    "category": "search",
    "category_en": "Local search",
    "category_zh": "局部搜索",
    "title": "Hill Climbing and Simulated Annealing",
    "title_zh": "爬山法与模拟退火",
    "desc": "Compare hill climbing with simulated annealing on the same optimization problem and starting state.",
    "desc_zh": "在同一优化问题和起始状态上比较爬山法与模拟退火。",
    "time": "25 min",
    "level": "core",
    "featured": "Use one start state to expose the difference between climbing and escaping.",
    "featured_zh": "用同一起点揭示上升与逃逸之间的区别。",
    "accent": "#a16207",
    "course_order": 2,
    "showcase_order": 9,
    "course_phase": "Search and optimization",
    "accent_name": "Ochre"
  },
  {
    "slug": "neural-network",
    "icon": "🧠",
    "category": "neural",
    "category_en": "Neural networks",
    "category_zh": "神经网络",
    "title": "Tiny Neural Network",
    "title_zh": "微型神经网络",
    "desc": "Train a compact network and compare linear composition with a nonlinear hidden representation.",
    "desc_zh": "训练一个小型网络，并比较线性组合与非线性隐藏表示。",
    "time": "30 min",
    "level": "advanced",
    "featured": "Toggle the activation to see what the hidden layer can actually represent.",
    "featured_zh": "切换激活函数，观察隐藏层真正能表示什么。",
    "accent": "#4338ca",
    "course_order": 9,
    "showcase_order": 10,
    "course_phase": "Neural networks",
    "accent_name": "Indigo"
  },
  {
    "slug": "kmeans",
    "icon": "🟣",
    "category": "ml",
    "category_en": "Clustering",
    "category_zh": "聚类",
    "title": "K-Means Clustering",
    "title_zh": "K 均值聚类",
    "desc": "Change k and initialization, then watch assignment and center updates reshape the clusters.",
    "desc_zh": "改变 k 和初始化方式，观察分配与中心更新如何重塑聚类。",
    "time": "25 min",
    "level": "core",
    "featured": "Run the same data from two initializations and compare the final clusters.",
    "featured_zh": "用两种初始化运行同一数据并比较最终聚类。",
    "accent": "#4d7c0f",
    "course_order": 10,
    "showcase_order": 11,
    "course_phase": "Unsupervised learning",
    "accent_name": "Olive"
  },
  {
    "slug": "convolution",
    "icon": "🖼️",
    "category": "vision",
    "category_en": "Computer vision",
    "category_zh": "计算机视觉",
    "title": "Convolution Playground",
    "title_zh": "卷积演练场",
    "desc": "Slide kernels across an image, inspect each multiply-and-sum, and compare hand-built with learned filters.",
    "desc_zh": "让卷积核滑过图像，检查每次乘加，并比较手工滤波器与学习滤波器。",
    "time": "30 min",
    "level": "advanced",
    "featured": "Apply edge, blur, and learned kernels to the same image.",
    "featured_zh": "在同一图像上应用边缘、模糊和学习卷积核。",
    "accent": "#0e7490",
    "course_order": 11,
    "showcase_order": 12,
    "course_phase": "Computer vision",
    "accent_name": "Cyan"
  }
]
