{
  "meta": {
    "version": "1.0.0",
    "updated": "2026-07-03",
    "xpPerLesson": 20,
    "xpPerQuiz": 50
  },
  "categories": [
    {
      "id": "ai",
      "name": {
        "en": "AI",
        "zh": "人工智能"
      },
      "accent": "#6c8cff"
    },
    {
      "id": "coding",
      "name": {
        "en": "Coding",
        "zh": "编程"
      },
      "accent": "#18c9b4"
    },
    {
      "id": "finance",
      "name": {
        "en": "Finance",
        "zh": "理财"
      },
      "accent": "#ffb547"
    },
    {
      "id": "language",
      "name": {
        "en": "Language",
        "zh": "语言"
      },
      "accent": "#ff6b9d"
    },
    {
      "id": "productivity",
      "name": {
        "en": "Productivity",
        "zh": "效率"
      },
      "accent": "#a78bfa"
    }
  ],
  "tracks": [
    {
      "id": "ai-foundations",
      "category": "ai",
      "level": "beginner",
      "icon": "🧠",
      "name": {
        "en": "AI Foundations",
        "zh": "AI 基础"
      },
      "tagline": {
        "en": "What AI actually is, in plain language.",
        "zh": "用大白话讲清楚 AI 到底是什么。"
      },
      "minutes": 35,
      "modules": [
        {
          "name": {
            "en": "Core ideas",
            "zh": "核心概念"
          },
          "lessons": [
            {
              "id": "af-1",
              "title": {
                "en": "What is machine learning?",
                "zh": "什么是机器学习？"
              },
              "concept": {
                "en": "Machine learning is teaching a program from examples instead of hand-writing every rule. You show it data, it finds the pattern.",
                "zh": "机器学习是用样本来“教”程序，而不是逐条手写规则。你给它数据，它自己找出规律。"
              },
              "points": {
                "en": [
                  "Rules are learned from data, not coded by hand",
                  "More & cleaner data usually beats a fancier model",
                  "The output is a prediction, not a guarantee"
                ],
                "zh": [
                  "规律来自数据，而非手写代码",
                  "更多、更干净的数据通常胜过更复杂的模型",
                  "输出是“预测”，不是“保证”"
                ]
              },
              "example": {
                "en": "A spam filter isn't told 'block the word lottery' — it learns which words correlate with spam from thousands of labeled emails.",
                "zh": "垃圾邮件过滤器并不是被告知“屏蔽彩票二字”，而是从上千封标注邮件中学到哪些词和垃圾邮件相关。"
              }
            },
            {
              "id": "af-2",
              "title": {
                "en": "Model, training, inference",
                "zh": "模型、训练、推理"
              },
              "concept": {
                "en": "Training is the one-time, expensive learning phase. Inference is using the trained model to answer new inputs — fast and cheap by comparison.",
                "zh": "训练是一次性的、昂贵的学习阶段；推理是用训练好的模型回答新输入，相对又快又便宜。"
              },
              "points": {
                "en": [
                  "Training = learn the parameters",
                  "Inference = apply them to new data",
                  "You train rarely, you infer constantly"
                ],
                "zh": [
                  "训练 = 学习参数",
                  "推理 = 把参数用到新数据上",
                  "训练很少做，推理时时刻刻在做"
                ]
              },
              "example": {
                "en": "GPT-style models are trained for months, then serve billions of inference requests per day.",
                "zh": "GPT 类模型要训练数月，之后每天服务数十亿次推理请求。"
              }
            }
          ]
        },
        {
          "name": {
            "en": "Large language models",
            "zh": "大语言模型"
          },
          "lessons": [
            {
              "id": "af-3",
              "title": {
                "en": "How an LLM predicts text",
                "zh": "大模型如何预测文字"
              },
              "concept": {
                "en": "An LLM predicts the next token (a chunk of text) over and over. Everything it 'knows' is compressed into weights that score which token comes next.",
                "zh": "大模型不断预测“下一个 token”（一小段文字）。它所“知道”的一切都压缩进权重里，用来给下一个 token 打分。"
              },
              "points": {
                "en": [
                  "It generates one token at a time",
                  "No live database lookup — it recalls from weights",
                  "Fluent text is not the same as true text"
                ],
                "zh": [
                  "一次生成一个 token",
                  "不是实时查数据库，而是从权重中“回忆”",
                  "流畅 ≠ 正确"
                ]
              },
              "example": {
                "en": "Given 'The capital of France is', the model scores 'Paris' highest and emits it.",
                "zh": "看到“The capital of France is”，模型给“Paris”打分最高并输出。"
              }
            },
            {
              "id": "af-4",
              "title": {
                "en": "Why models hallucinate",
                "zh": "模型为什么会“幻觉”"
              },
              "concept": {
                "en": "Because a model optimizes for plausible next tokens, it can produce confident, well-formed answers that are simply wrong. It has no built-in truth check.",
                "zh": "模型优化的是“看起来合理的下一个 token”，因此会给出自信、通顺却完全错误的答案。它没有内建的真伪校验。"
              },
              "points": {
                "en": [
                  "Confidence in tone ≠ correctness",
                  "Ask for sources; verify facts",
                  "Grounding it with real data reduces this"
                ],
                "zh": [
                  "语气自信 ≠ 事实正确",
                  "要求给出来源并核实",
                  "用真实数据“接地”可减少幻觉"
                ]
              },
              "example": {
                "en": "Ask for a citation and a model may invent a realistic-looking paper that doesn't exist.",
                "zh": "让模型给出引用，它可能编造一篇看起来很真、其实不存在的论文。"
              }
            }
          ]
        }
      ],
      "deck": [
        {
          "q": {
            "en": "Machine learning learns rules from ___.",
            "zh": "机器学习从 ___ 中学习规律。"
          },
          "a": {
            "en": "data (examples)",
            "zh": "数据（样本）"
          }
        },
        {
          "q": {
            "en": "Training vs inference?",
            "zh": "训练 vs 推理？"
          },
          "a": {
            "en": "Train = learn params (rare); infer = apply them (constant).",
            "zh": "训练 = 学参数（少）；推理 = 用参数（多）。"
          }
        },
        {
          "q": {
            "en": "What does an LLM predict?",
            "zh": "大模型预测什么？"
          },
          "a": {
            "en": "The next token, repeatedly.",
            "zh": "反复预测下一个 token。"
          }
        },
        {
          "q": {
            "en": "Why do models hallucinate?",
            "zh": "模型为何幻觉？"
          },
          "a": {
            "en": "They optimize plausibility, not truth.",
            "zh": "它优化的是合理性，不是真伪。"
          }
        },
        {
          "q": {
            "en": "Does an LLM look things up live?",
            "zh": "大模型会实时查资料吗？"
          },
          "a": {
            "en": "No — it recalls from weights unless grounded.",
            "zh": "不会，除非接地，否则从权重回忆。"
          }
        },
        {
          "q": {
            "en": "More data or fancier model?",
            "zh": "更多数据还是更炫模型？"
          },
          "a": {
            "en": "More & cleaner data usually wins.",
            "zh": "更多、更干净的数据通常更好。"
          }
        }
      ],
      "quiz": [
        {
          "q": {
            "en": "In machine learning, rules come from…",
            "zh": "机器学习中，规律来自……"
          },
          "options": {
            "en": [
              "Hand-written code",
              "Data examples",
              "Random guesses",
              "The compiler"
            ],
            "zh": [
              "手写代码",
              "数据样本",
              "随机猜测",
              "编译器"
            ]
          },
          "answer": 1
        },
        {
          "q": {
            "en": "Which phase is fast and cheap per request?",
            "zh": "哪个阶段单次又快又便宜？"
          },
          "options": {
            "en": [
              "Training",
              "Inference",
              "Both equal",
              "Neither"
            ],
            "zh": [
              "训练",
              "推理",
              "一样",
              "都不是"
            ]
          },
          "answer": 1
        },
        {
          "q": {
            "en": "An LLM generates output…",
            "zh": "大模型生成输出是……"
          },
          "options": {
            "en": [
              "All at once",
              "One token at a time",
              "By querying Google",
              "From a fixed list"
            ],
            "zh": [
              "一次性全出",
              "一次一个 token",
              "去查谷歌",
              "从固定清单选"
            ]
          },
          "answer": 1
        },
        {
          "q": {
            "en": "A hallucination is an answer that is…",
            "zh": "“幻觉”是指答案……"
          },
          "options": {
            "en": [
              "Slow",
              "Confident but wrong",
              "Too short",
              "In another language"
            ],
            "zh": [
              "很慢",
              "自信却错误",
              "太短",
              "换了语言"
            ]
          },
          "answer": 1
        }
      ]
    },
    {
      "id": "prompt-engineering",
      "category": "ai",
      "level": "intermediate",
      "icon": "✍️",
      "name": {
        "en": "Prompt Engineering",
        "zh": "提示词工程"
      },
      "tagline": {
        "en": "Get reliable results out of any model.",
        "zh": "让任何模型稳定给出好结果。"
      },
      "minutes": 40,
      "modules": [
        {
          "name": {
            "en": "Fundamentals",
            "zh": "基本功"
          },
          "lessons": [
            {
              "id": "pe-1",
              "title": {
                "en": "Be specific about the output",
                "zh": "把“想要的输出”说清楚"
              },
              "concept": {
                "en": "Models fill gaps with assumptions. State the format, length, audience, and tone you want, and you remove the guesswork.",
                "zh": "模型会用假设来填补空白。明确写出格式、长度、受众和语气，就能消除猜测。"
              },
              "points": {
                "en": [
                  "Name the format (list, JSON, table)",
                  "Set length and audience",
                  "Show one example if you can"
                ],
                "zh": [
                  "指定格式（列表、JSON、表格）",
                  "设定长度与受众",
                  "尽量给一个示例"
                ]
              },
              "example": {
                "en": "'Summarize in 3 bullets for a busy CEO' beats 'summarize this'.",
                "zh": "“用 3 条要点为繁忙的 CEO 总结” 胜过 “总结一下”。"
              }
            },
            {
              "id": "pe-2",
              "title": {
                "en": "Give the model a role",
                "zh": "给模型一个角色"
              },
              "concept": {
                "en": "A role primes the model's vocabulary and standards. 'You are a senior editor' shifts its output toward that persona's judgment.",
                "zh": "角色会激活模型的词汇与标准。“你是一名资深编辑” 会把输出引向该角色的判断力。"
              },
              "points": {
                "en": [
                  "Role sets tone + expertise level",
                  "Pair with a clear task",
                  "Don't overload with 5 roles at once"
                ],
                "zh": [
                  "角色决定语气与专业度",
                  "配合明确任务",
                  "别一次塞 5 个角色"
                ]
              },
              "example": {
                "en": "'Act as a patient tutor for a 10-year-old' changes explanations dramatically.",
                "zh": "“扮演有耐心的老师，面向 10 岁孩子” 会显著改变讲解方式。"
              }
            }
          ]
        },
        {
          "name": {
            "en": "Advanced moves",
            "zh": "进阶技巧"
          },
          "lessons": [
            {
              "id": "pe-3",
              "title": {
                "en": "Few-shot examples",
                "zh": "少样本示例"
              },
              "concept": {
                "en": "Showing 2–3 input→output examples teaches the pattern more reliably than describing it. The model imitates the shape you demonstrate.",
                "zh": "给出 2–3 个“输入→输出”示例，比单纯描述更可靠。模型会模仿你展示的样式。"
              },
              "points": {
                "en": [
                  "Examples > adjectives",
                  "Keep examples consistent in format",
                  "Cover an edge case in one example"
                ],
                "zh": [
                  "示例胜过形容词",
                  "示例格式要一致",
                  "用一个示例覆盖边界情况"
                ]
              },
              "example": {
                "en": "To classify sentiment, show 3 labeled reviews first, then the new one.",
                "zh": "做情感分类时，先给 3 条带标签的评论，再放新评论。"
              }
            },
            {
              "id": "pe-4",
              "title": {
                "en": "Ask it to think step by step",
                "zh": "让它“一步步想”"
              },
              "concept": {
                "en": "For reasoning tasks, asking the model to work through steps before answering raises accuracy — it allocates more computation to the problem.",
                "zh": "对推理类任务，先让模型“分步推演”再给答案，能提升准确率——它为问题分配了更多计算。"
              },
              "points": {
                "en": [
                  "Great for math/logic/multi-step",
                  "Ask for steps, then a final answer",
                  "Verify the steps, not just the result"
                ],
                "zh": [
                  "适合数学/逻辑/多步问题",
                  "先要过程，再要最终答案",
                  "核对过程，而不仅是结果"
                ]
              },
              "example": {
                "en": "'Show your reasoning, then give the final number on the last line.'",
                "zh": "“先写出推理，再在最后一行给出最终数字。”"
              }
            }
          ]
        }
      ],
      "deck": [
        {
          "q": {
            "en": "First fix for a vague answer?",
            "zh": "答案太空泛，先改什么？"
          },
          "a": {
            "en": "Specify format, length, audience.",
            "zh": "指定格式、长度、受众。"
          }
        },
        {
          "q": {
            "en": "What does a role do?",
            "zh": "角色有什么用？"
          },
          "a": {
            "en": "Primes tone and expertise.",
            "zh": "设定语气与专业度。"
          }
        },
        {
          "q": {
            "en": "Few-shot means…",
            "zh": "少样本是指……"
          },
          "a": {
            "en": "Showing 2–3 example pairs.",
            "zh": "给出 2–3 个示例对。"
          }
        },
        {
          "q": {
            "en": "Boost reasoning accuracy how?",
            "zh": "如何提升推理准确率？"
          },
          "a": {
            "en": "Ask it to think step by step.",
            "zh": "让它一步步思考。"
          }
        },
        {
          "q": {
            "en": "Examples vs adjectives?",
            "zh": "示例还是形容词？"
          },
          "a": {
            "en": "Examples teach the pattern better.",
            "zh": "示例更能教会样式。"
          }
        },
        {
          "q": {
            "en": "Where to put the final answer?",
            "zh": "最终答案放哪？"
          },
          "a": {
            "en": "On its own last line, after steps.",
            "zh": "过程之后，单独最后一行。"
          }
        }
      ],
      "quiz": [
        {
          "q": {
            "en": "The single best cure for vague output is to…",
            "zh": "治“空泛输出”最有效的一招是……"
          },
          "options": {
            "en": [
              "Ask twice",
              "Specify format/length/audience",
              "Use ALL CAPS",
              "Add emojis"
            ],
            "zh": [
              "问两遍",
              "指定格式/长度/受众",
              "全用大写",
              "多加表情"
            ]
          },
          "answer": 1
        },
        {
          "q": {
            "en": "Few-shot prompting provides…",
            "zh": "少样本提示提供的是……"
          },
          "options": {
            "en": [
              "A longer question",
              "Example input→output pairs",
              "A system password",
              "More tokens only"
            ],
            "zh": [
              "更长的问题",
              "输入→输出示例对",
              "系统密码",
              "只是更多 token"
            ]
          },
          "answer": 1
        },
        {
          "q": {
            "en": "'Think step by step' most helps…",
            "zh": "“一步步想”最有助于……"
          },
          "options": {
            "en": [
              "Reasoning tasks",
              "Shortening replies",
              "Translating",
              "Formatting JSON"
            ],
            "zh": [
              "推理类任务",
              "缩短回复",
              "翻译",
              "格式化 JSON"
            ]
          },
          "answer": 0
        },
        {
          "q": {
            "en": "Assigning a role mainly changes…",
            "zh": "指定角色主要改变……"
          },
          "options": {
            "en": [
              "The model's size",
              "Tone & expertise",
              "Your API key",
              "The token price"
            ],
            "zh": [
              "模型大小",
              "语气与专业度",
              "你的 API 密钥",
              "token 价格"
            ]
          },
          "answer": 1
        }
      ]
    },
    {
      "id": "python-basics",
      "category": "coding",
      "level": "beginner",
      "icon": "🐍",
      "name": {
        "en": "Python Basics",
        "zh": "Python 入门"
      },
      "tagline": {
        "en": "From zero to writing real scripts.",
        "zh": "从零到能写真正的脚本。"
      },
      "minutes": 45,
      "modules": [
        {
          "name": {
            "en": "Values & variables",
            "zh": "值与变量"
          },
          "lessons": [
            {
              "id": "py-1",
              "title": {
                "en": "Variables and types",
                "zh": "变量与类型"
              },
              "concept": {
                "en": "A variable is a name pointing to a value. Python figures out the type (int, str, float, bool) for you — no declaration needed.",
                "zh": "变量是指向值的名字。Python 会自动判断类型（int、str、float、bool），无需声明。"
              },
              "points": {
                "en": [
                  "x = 5 makes x an int",
                  "Use snake_case names",
                  "type(x) tells you the type"
                ],
                "zh": [
                  "x = 5 让 x 成为 int",
                  "使用 snake_case 命名",
                  "type(x) 可查看类型"
                ]
              },
              "example": {
                "en": "name = 'Ada'; age = 36; is_admin = True",
                "zh": "name = 'Ada'; age = 36; is_admin = True"
              }
            },
            {
              "id": "py-2",
              "title": {
                "en": "Lists and loops",
                "zh": "列表与循环"
              },
              "concept": {
                "en": "A list holds an ordered collection. A for-loop walks each item. Together they handle most 'do this to everything' tasks.",
                "zh": "列表存放有序集合，for 循环逐个遍历。二者结合能处理大多数“对每一项做某事”的任务。"
              },
              "points": {
                "en": [
                  "nums = [1, 2, 3]",
                  "for n in nums: print(n)",
                  "len(nums) counts items"
                ],
                "zh": [
                  "nums = [1, 2, 3]",
                  "for n in nums: print(n)",
                  "len(nums) 计数"
                ]
              },
              "example": {
                "en": "for city in ['NYC','LA']: print('Hello', city)",
                "zh": "for city in ['NYC','LA']: print('Hello', city)"
              }
            }
          ]
        },
        {
          "name": {
            "en": "Structure",
            "zh": "结构"
          },
          "lessons": [
            {
              "id": "py-3",
              "title": {
                "en": "Functions",
                "zh": "函数"
              },
              "concept": {
                "en": "A function packages reusable logic behind a name. Inputs go in as arguments; a result comes back with return.",
                "zh": "函数把可复用的逻辑封装在一个名字后面。输入作为参数传入，用 return 返回结果。"
              },
              "points": {
                "en": [
                  "def greet(name): ...",
                  "return sends a value back",
                  "Call it: greet('Ada')"
                ],
                "zh": [
                  "def greet(name): ...",
                  "return 返回一个值",
                  "调用：greet('Ada')"
                ]
              },
              "example": {
                "en": "def add(a, b):\n    return a + b",
                "zh": "def add(a, b):\n    return a + b"
              }
            },
            {
              "id": "py-4",
              "title": {
                "en": "if / else",
                "zh": "if / else 条件"
              },
              "concept": {
                "en": "Conditionals let a program choose a path. Python uses indentation, not braces, to mark which lines belong to each branch.",
                "zh": "条件语句让程序选择路径。Python 用缩进（而非大括号）来标记每个分支包含哪些行。"
              },
              "points": {
                "en": [
                  "if x > 0: ... else: ...",
                  "Indentation defines the block",
                  "elif chains more cases"
                ],
                "zh": [
                  "if x > 0: ... else: ...",
                  "缩进决定代码块",
                  "elif 串联更多情况"
                ]
              },
              "example": {
                "en": "if score >= 60:\n    print('Pass')\nelse:\n    print('Retry')",
                "zh": "if score >= 60:\n    print('Pass')\nelse:\n    print('Retry')"
              }
            }
          ]
        }
      ],
      "deck": [
        {
          "q": {
            "en": "How to make x an integer 5?",
            "zh": "如何让 x 为整数 5？"
          },
          "a": {
            "en": "x = 5",
            "zh": "x = 5"
          }
        },
        {
          "q": {
            "en": "Loop over a list?",
            "zh": "遍历列表？"
          },
          "a": {
            "en": "for n in nums:",
            "zh": "for n in nums:"
          }
        },
        {
          "q": {
            "en": "Return a value from a function?",
            "zh": "从函数返回值？"
          },
          "a": {
            "en": "return value",
            "zh": "return value"
          }
        },
        {
          "q": {
            "en": "Count items in a list?",
            "zh": "统计列表项数？"
          },
          "a": {
            "en": "len(nums)",
            "zh": "len(nums)"
          }
        },
        {
          "q": {
            "en": "How does Python mark a block?",
            "zh": "Python 如何标记代码块？"
          },
          "a": {
            "en": "Indentation.",
            "zh": "缩进。"
          }
        },
        {
          "q": {
            "en": "Add a second condition?",
            "zh": "加第二个条件？"
          },
          "a": {
            "en": "elif",
            "zh": "elif"
          }
        }
      ],
      "quiz": [
        {
          "q": {
            "en": "Which creates a list?",
            "zh": "哪个创建列表？"
          },
          "options": {
            "en": [
              "{1,2,3}",
              "[1,2,3]",
              "(1,2,3)",
              "<1,2,3>"
            ],
            "zh": [
              "{1,2,3}",
              "[1,2,3]",
              "(1,2,3)",
              "<1,2,3>"
            ]
          },
          "answer": 1
        },
        {
          "q": {
            "en": "Python blocks are defined by…",
            "zh": "Python 代码块由……定义"
          },
          "options": {
            "en": [
              "Braces {}",
              "Semicolons",
              "Indentation",
              "Parentheses"
            ],
            "zh": [
              "大括号 {}",
              "分号",
              "缩进",
              "小括号"
            ]
          },
          "answer": 2
        },
        {
          "q": {
            "en": "A function returns a value with…",
            "zh": "函数用什么返回值？"
          },
          "options": {
            "en": [
              "yield",
              "return",
              "give",
              "out"
            ],
            "zh": [
              "yield",
              "return",
              "give",
              "out"
            ]
          },
          "answer": 1
        },
        {
          "q": {
            "en": "len([4,5,6]) is…",
            "zh": "len([4,5,6]) 是……"
          },
          "options": {
            "en": [
              "2",
              "3",
              "6",
              "15"
            ],
            "zh": [
              "2",
              "3",
              "6",
              "15"
            ]
          },
          "answer": 1
        }
      ]
    },
    {
      "id": "personal-finance",
      "category": "finance",
      "level": "beginner",
      "icon": "💰",
      "name": {
        "en": "Personal Finance 101",
        "zh": "个人理财 101"
      },
      "tagline": {
        "en": "Budget, save, and start investing.",
        "zh": "预算、储蓄、开始投资。"
      },
      "minutes": 30,
      "modules": [
        {
          "name": {
            "en": "Cash flow",
            "zh": "现金流"
          },
          "lessons": [
            {
              "id": "pf-1",
              "title": {
                "en": "The 50/30/20 rule",
                "zh": "50/30/20 法则"
              },
              "concept": {
                "en": "A simple budget: 50% of after-tax income to needs, 30% to wants, 20% to savings & debt payoff. Adjust to your reality.",
                "zh": "一个简单预算：税后收入的 50% 给必需、30% 给想要、20% 给储蓄与还债。按自身情况调整。"
              },
              "points": {
                "en": [
                  "Needs: rent, food, utilities",
                  "Wants: dining, subscriptions",
                  "20% builds your future"
                ],
                "zh": [
                  "必需：房租、饮食、水电",
                  "想要：外食、订阅",
                  "20% 用于未来"
                ]
              },
              "example": {
                "en": "On $4,000/mo take-home: $2,000 needs, $1,200 wants, $800 saved.",
                "zh": "税后 4000/月：2000 必需、1200 想要、800 储蓄。"
              }
            },
            {
              "id": "pf-2",
              "title": {
                "en": "Emergency fund",
                "zh": "应急基金"
              },
              "concept": {
                "en": "Keep 3–6 months of essential expenses in cash. It stops one bad month from turning into debt.",
                "zh": "预留 3–6 个月的必要开支现金。它能防止一个糟糕的月份滚成债务。"
              },
              "points": {
                "en": [
                  "Cover essentials, not lifestyle",
                  "Keep it liquid & separate",
                  "Rebuild it after you use it"
                ],
                "zh": [
                  "覆盖必需，而非生活方式",
                  "保持流动且单独存放",
                  "用后要补回"
                ]
              },
              "example": {
                "en": "If essentials are $2k/mo, target $6k–$12k in a savings account.",
                "zh": "若必需为 2000/月，目标是储蓄账户里 6000–12000。"
              }
            }
          ]
        },
        {
          "name": {
            "en": "Growing money",
            "zh": "让钱增长"
          },
          "lessons": [
            {
              "id": "pf-3",
              "title": {
                "en": "Compound interest",
                "zh": "复利"
              },
              "concept": {
                "en": "Earnings generate their own earnings over time. Starting early beats investing more later because time is the biggest multiplier.",
                "zh": "收益会再生收益。早开始胜过晚投入更多，因为时间是最大的乘数。"
              },
              "points": {
                "en": [
                  "Time in the market > timing it",
                  "Reinvest returns",
                  "Small amounts early add up hugely"
                ],
                "zh": [
                  "在场时间 > 择时",
                  "把收益再投资",
                  "早期小额也能积累巨大"
                ]
              },
              "example": {
                "en": "$200/mo at 7% for 30 years ≈ $243k; starting 10 years later ≈ $101k.",
                "zh": "每月 200、7%、30 年 ≈ 24.3 万；晚开始 10 年 ≈ 10.1 万。"
              }
            },
            {
              "id": "pf-4",
              "title": {
                "en": "Index funds",
                "zh": "指数基金"
              },
              "concept": {
                "en": "An index fund buys the whole market at low cost. For most people it beats picking individual stocks after fees.",
                "zh": "指数基金以低成本买入整个市场。扣费后，对大多数人而言胜过挑选个股。"
              },
              "points": {
                "en": [
                  "Broad diversification, low fees",
                  "You own hundreds of companies",
                  "Boring and effective"
                ],
                "zh": [
                  "广泛分散、费用低",
                  "一次持有数百家公司",
                  "无聊但有效"
                ]
              },
              "example": {
                "en": "A total-market index fund holds thousands of stocks in one ticker.",
                "zh": "一只全市场指数基金用一个代码持有数千只股票。"
              }
            }
          ]
        }
      ],
      "deck": [
        {
          "q": {
            "en": "50/30/20 split?",
            "zh": "50/30/20 分别是？"
          },
          "a": {
            "en": "Needs / wants / savings.",
            "zh": "必需 / 想要 / 储蓄。"
          }
        },
        {
          "q": {
            "en": "Emergency fund size?",
            "zh": "应急基金多大？"
          },
          "a": {
            "en": "3–6 months of essentials.",
            "zh": "3–6 个月必需开支。"
          }
        },
        {
          "q": {
            "en": "Biggest multiplier in investing?",
            "zh": "投资中最大的乘数？"
          },
          "a": {
            "en": "Time (compounding).",
            "zh": "时间（复利）。"
          }
        },
        {
          "q": {
            "en": "Low-cost way to own the market?",
            "zh": "低成本持有全市场？"
          },
          "a": {
            "en": "Index funds.",
            "zh": "指数基金。"
          }
        },
        {
          "q": {
            "en": "Time in market vs timing?",
            "zh": "在场时间 vs 择时？"
          },
          "a": {
            "en": "Time in market wins.",
            "zh": "在场时间胜出。"
          }
        },
        {
          "q": {
            "en": "Where to keep the emergency fund?",
            "zh": "应急基金放哪？"
          },
          "a": {
            "en": "Liquid, separate savings.",
            "zh": "流动、单独的储蓄。"
          }
        }
      ],
      "quiz": [
        {
          "q": {
            "en": "In 50/30/20, the 20% is for…",
            "zh": "50/30/20 中 20% 用于……"
          },
          "options": {
            "en": [
              "Wants",
              "Needs",
              "Savings & debt",
              "Taxes"
            ],
            "zh": [
              "想要",
              "必需",
              "储蓄与还债",
              "税"
            ]
          },
          "answer": 2
        },
        {
          "q": {
            "en": "An emergency fund typically covers…",
            "zh": "应急基金通常覆盖……"
          },
          "options": {
            "en": [
              "1 week",
              "3–6 months",
              "10 years",
              "Vacations"
            ],
            "zh": [
              "1 周",
              "3–6 个月",
              "10 年",
              "度假"
            ]
          },
          "answer": 1
        },
        {
          "q": {
            "en": "Compound interest rewards…",
            "zh": "复利奖励的是……"
          },
          "options": {
            "en": [
              "Starting early",
              "Perfect timing",
              "Big single bets",
              "High fees"
            ],
            "zh": [
              "早开始",
              "完美择时",
              "单笔重仓",
              "高费用"
            ]
          },
          "answer": 0
        },
        {
          "q": {
            "en": "Index funds are known for…",
            "zh": "指数基金以什么著称？"
          },
          "options": {
            "en": [
              "High fees",
              "Picking winners",
              "Low cost & diversification",
              "Guaranteed returns"
            ],
            "zh": [
              "高费用",
              "挑赢家",
              "低成本与分散",
              "保证收益"
            ]
          },
          "answer": 2
        }
      ]
    },
    {
      "id": "business-english",
      "category": "language",
      "level": "intermediate",
      "icon": "💬",
      "name": {
        "en": "Business English",
        "zh": "商务英语"
      },
      "tagline": {
        "en": "Write clear, confident work messages.",
        "zh": "写出清晰、自信的职场沟通。"
      },
      "minutes": 30,
      "modules": [
        {
          "name": {
            "en": "Email",
            "zh": "邮件"
          },
          "lessons": [
            {
              "id": "be-1",
              "title": {
                "en": "Subject lines that get opened",
                "zh": "让人愿意打开的主题行"
              },
              "concept": {
                "en": "A good subject line states the action and the deadline. Vague subjects get ignored; specific ones get replies.",
                "zh": "好的主题行写清“要做的事”和“截止时间”。含糊被忽略，具体才有回复。"
              },
              "points": {
                "en": [
                  "Lead with the ask",
                  "Include a date if time-bound",
                  "Keep under ~8 words"
                ],
                "zh": [
                  "先说请求",
                  "有时限就写日期",
                  "控制在约 8 个词内"
                ]
              },
              "example": {
                "en": "'Approval needed: Q3 budget by Fri' > 'Budget'.",
                "zh": "“Approval needed: Q3 budget by Fri” 胜过 “Budget”。"
              }
            },
            {
              "id": "be-2",
              "title": {
                "en": "Polite but direct requests",
                "zh": "礼貌又直接的请求"
              },
              "concept": {
                "en": "Soften the frame, keep the ask clear. 'Could you send X by Thursday?' is polite and unambiguous.",
                "zh": "语气可以委婉，请求必须清楚。“Could you send X by Thursday?” 既礼貌又不含糊。"
              },
              "points": {
                "en": [
                  "Could you…? / Would you mind…?",
                  "State exactly what and when",
                  "One ask per message when possible"
                ],
                "zh": [
                  "Could you…? / Would you mind…?",
                  "写清做什么、何时",
                  "尽量每封一个请求"
                ]
              },
              "example": {
                "en": "'Could you review the draft by EOD Wednesday? Happy to walk you through it.'",
                "zh": "“Could you review the draft by EOD Wednesday? Happy to walk you through it.”"
              }
            }
          ]
        },
        {
          "name": {
            "en": "Meetings",
            "zh": "会议"
          },
          "lessons": [
            {
              "id": "be-3",
              "title": {
                "en": "Useful meeting phrases",
                "zh": "实用会议句型"
              },
              "concept": {
                "en": "A few reusable phrases let you steer a meeting: agreeing, disagreeing gently, and asking for clarity.",
                "zh": "几句可复用的句型就能引导会议：赞同、委婉反对、请求澄清。"
              },
              "points": {
                "en": [
                  "'Just to build on that…'",
                  "'I see it a bit differently…'",
                  "'Could you clarify what you mean by…?'"
                ],
                "zh": [
                  "'Just to build on that…'（补充）",
                  "'I see it a bit differently…'（不同看法）",
                  "'Could you clarify…?'（澄清）"
                ]
              },
              "example": {
                "en": "'I see it a bit differently — could we look at the cost side too?'",
                "zh": "“I see it a bit differently — could we look at the cost side too?”"
              }
            },
            {
              "id": "be-4",
              "title": {
                "en": "Following up",
                "zh": "跟进"
              },
              "concept": {
                "en": "A short recap email after a meeting locks in decisions and owners. It prevents 'I thought you were doing that'.",
                "zh": "会后一封简短纪要能锁定决定与负责人，避免“我以为是你做”。"
              },
              "points": {
                "en": [
                  "List decisions & owners",
                  "Note next steps + dates",
                  "Keep it scannable"
                ],
                "zh": [
                  "列出决定与负责人",
                  "写明下一步与日期",
                  "保持易扫读"
                ]
              },
              "example": {
                "en": "'Recap: (1) Ada owns the deck, due Tue. (2) We ship Thu.'",
                "zh": "“Recap: (1) Ada 负责 deck，周二前。(2) 周四发布。”"
              }
            }
          ]
        }
      ],
      "deck": [
        {
          "q": {
            "en": "Good subject line includes…",
            "zh": "好主题行包含……"
          },
          "a": {
            "en": "The action + a deadline.",
            "zh": "动作 + 截止时间。"
          }
        },
        {
          "q": {
            "en": "Polite request opener?",
            "zh": "礼貌请求开头？"
          },
          "a": {
            "en": "'Could you…?'",
            "zh": "“Could you…?”"
          }
        },
        {
          "q": {
            "en": "Gently disagree with…",
            "zh": "委婉反对用……"
          },
          "a": {
            "en": "'I see it a bit differently…'",
            "zh": "“I see it a bit differently…”"
          }
        },
        {
          "q": {
            "en": "After a meeting, send…",
            "zh": "会后要发……"
          },
          "a": {
            "en": "A recap with owners & dates.",
            "zh": "含负责人与日期的纪要。"
          }
        },
        {
          "q": {
            "en": "How many asks per email?",
            "zh": "每封邮件几个请求？"
          },
          "a": {
            "en": "Ideally one.",
            "zh": "最好一个。"
          }
        },
        {
          "q": {
            "en": "Ask for clarity with…",
            "zh": "请求澄清用……"
          },
          "a": {
            "en": "'Could you clarify…?'",
            "zh": "“Could you clarify…?”"
          }
        }
      ],
      "quiz": [
        {
          "q": {
            "en": "The strongest subject line is…",
            "zh": "最有效的主题行是……"
          },
          "options": {
            "en": [
              "'Hi'",
              "'Budget'",
              "'Approval needed: Q3 budget by Fri'",
              "'Important!!!'"
            ],
            "zh": [
              "'Hi'",
              "'Budget'",
              "'Approval needed: Q3 budget by Fri'",
              "'Important!!!'"
            ]
          },
          "answer": 2
        },
        {
          "q": {
            "en": "A polite, clear request starts with…",
            "zh": "礼貌清晰的请求开头是……"
          },
          "options": {
            "en": [
              "'Do it.'",
              "'Could you…?'",
              "'ASAP'",
              "'FYI'"
            ],
            "zh": [
              "'Do it.'",
              "'Could you…?'",
              "'ASAP'",
              "'FYI'"
            ]
          },
          "answer": 1
        },
        {
          "q": {
            "en": "To disagree gently you say…",
            "zh": "委婉反对时说……"
          },
          "options": {
            "en": [
              "'You're wrong'",
              "'I see it a bit differently'",
              "'No.'",
              "'Whatever'"
            ],
            "zh": [
              "'You're wrong'",
              "'I see it a bit differently'",
              "'No.'",
              "'Whatever'"
            ]
          },
          "answer": 1
        },
        {
          "q": {
            "en": "A follow-up recap should list…",
            "zh": "跟进纪要应列出……"
          },
          "options": {
            "en": [
              "Weather",
              "Decisions, owners, dates",
              "Your lunch",
              "Nothing"
            ],
            "zh": [
              "天气",
              "决定、负责人、日期",
              "你的午餐",
              "什么都不列"
            ]
          },
          "answer": 1
        }
      ]
    },
    {
      "id": "deep-work",
      "category": "productivity",
      "level": "beginner",
      "icon": "🎯",
      "name": {
        "en": "Deep Work & Focus",
        "zh": "深度工作与专注"
      },
      "tagline": {
        "en": "Do your best thinking on purpose.",
        "zh": "有意识地进入最佳思考状态。"
      },
      "minutes": 25,
      "modules": [
        {
          "name": {
            "en": "Attention",
            "zh": "注意力"
          },
          "lessons": [
            {
              "id": "dw-1",
              "title": {
                "en": "Single-tasking",
                "zh": "单任务"
              },
              "concept": {
                "en": "Switching tasks carries a hidden 'attention residue' cost. Doing one thing fully is faster than juggling three.",
                "zh": "任务切换会留下隐性的“注意力残留”成本。专注做完一件，比同时抛接三件更快。"
              },
              "points": {
                "en": [
                  "Batch similar tasks",
                  "Close unrelated tabs",
                  "One primary task per block"
                ],
                "zh": [
                  "同类任务成批做",
                  "关掉无关标签页",
                  "每个时段一个主任务"
                ]
              },
              "example": {
                "en": "Answer all email in one 20-min block, not 30 times a day.",
                "zh": "把邮件集中在一个 20 分钟时段回，而不是一天回 30 次。"
              }
            },
            {
              "id": "dw-2",
              "title": {
                "en": "Time blocking",
                "zh": "时间分块"
              },
              "concept": {
                "en": "Give every hour a job in advance. A planned day resists interruptions because the default is already decided.",
                "zh": "提前给每个小时安排任务。计划好的一天更抗打断，因为“默认要做什么”已经定好了。"
              },
              "points": {
                "en": [
                  "Plan the day the night before",
                  "Protect one deep block",
                  "Leave buffer for overflow"
                ],
                "zh": [
                  "前一晚规划次日",
                  "守住一个深度时段",
                  "留出缓冲应对超时"
                ]
              },
              "example": {
                "en": "9–11am: deep work (phone in another room). 11–11:30: email.",
                "zh": "上午 9–11：深度工作（手机放另一屋）。11–11:30：邮件。"
              }
            }
          ]
        },
        {
          "name": {
            "en": "Sustaining it",
            "zh": "持续"
          },
          "lessons": [
            {
              "id": "dw-3",
              "title": {
                "en": "The Pomodoro rhythm",
                "zh": "番茄工作法节奏"
              },
              "concept": {
                "en": "Work in focused 25-minute sprints with 5-minute breaks. The timer creates urgency and the breaks prevent burnout.",
                "zh": "以专注的 25 分钟冲刺加 5 分钟休息为节奏。计时带来紧迫感，休息避免倦怠。"
              },
              "points": {
                "en": [
                  "25 on / 5 off",
                  "Longer break every 4 rounds",
                  "One clear goal per sprint"
                ],
                "zh": [
                  "25 分钟专注 / 5 分钟休息",
                  "每 4 轮长休一次",
                  "每次冲刺一个明确目标"
                ]
              },
              "example": {
                "en": "Sprint 1: outline the report. Break. Sprint 2: write section 1.",
                "zh": "冲刺 1：列报告提纲。休息。冲刺 2：写第一节。"
              }
            },
            {
              "id": "dw-4",
              "title": {
                "en": "Beating distraction",
                "zh": "战胜分心"
              },
              "concept": {
                "en": "Make distraction harder than focus. Friction — logging out, phone away, notifications off — beats willpower.",
                "zh": "让分心比专注更“费劲”。制造摩擦——退出登录、手机拿远、关通知——胜过靠意志力。"
              },
              "points": {
                "en": [
                  "Remove the trigger, not just the urge",
                  "Phone out of sight, out of reach",
                  "Notifications off during deep blocks"
                ],
                "zh": [
                  "移除诱因，而非仅压制冲动",
                  "手机看不见、够不着",
                  "深度时段关闭通知"
                ]
              },
              "example": {
                "en": "Leaving your phone in another room cuts checking far more than 'trying harder'.",
                "zh": "把手机放到另一个房间，比“更努力克制”更能减少查看。"
              }
            }
          ]
        }
      ],
      "deck": [
        {
          "q": {
            "en": "Hidden cost of task switching?",
            "zh": "任务切换的隐性成本？"
          },
          "a": {
            "en": "Attention residue.",
            "zh": "注意力残留。"
          }
        },
        {
          "q": {
            "en": "Time blocking means…",
            "zh": "时间分块是指……"
          },
          "a": {
            "en": "Assigning each hour a job in advance.",
            "zh": "提前给每小时安排任务。"
          }
        },
        {
          "q": {
            "en": "Pomodoro ratio?",
            "zh": "番茄工作法比例？"
          },
          "a": {
            "en": "25 min on / 5 min off.",
            "zh": "25 分钟专注 / 5 分钟休息。"
          }
        },
        {
          "q": {
            "en": "Best defense against distraction?",
            "zh": "对抗分心的最佳方式？"
          },
          "a": {
            "en": "Add friction; remove the trigger.",
            "zh": "制造摩擦；移除诱因。"
          }
        },
        {
          "q": {
            "en": "How often a longer Pomodoro break?",
            "zh": "番茄工作法多久长休一次？"
          },
          "a": {
            "en": "Every 4 rounds.",
            "zh": "每 4 轮。"
          }
        },
        {
          "q": {
            "en": "Batch email into…",
            "zh": "邮件应集中成……"
          },
          "a": {
            "en": "One focused block.",
            "zh": "一个专注时段。"
          }
        }
      ],
      "quiz": [
        {
          "q": {
            "en": "'Attention residue' is caused by…",
            "zh": "“注意力残留”由什么造成？"
          },
          "options": {
            "en": [
              "Sleep",
              "Task switching",
              "Coffee",
              "Music"
            ],
            "zh": [
              "睡眠",
              "任务切换",
              "咖啡",
              "音乐"
            ]
          },
          "answer": 1
        },
        {
          "q": {
            "en": "The classic Pomodoro sprint is…",
            "zh": "经典番茄冲刺时长是……"
          },
          "options": {
            "en": [
              "10 min",
              "25 min",
              "60 min",
              "90 min"
            ],
            "zh": [
              "10 分钟",
              "25 分钟",
              "60 分钟",
              "90 分钟"
            ]
          },
          "answer": 1
        },
        {
          "q": {
            "en": "Time blocking works because…",
            "zh": "时间分块有效是因为……"
          },
          "options": {
            "en": [
              "It's fun",
              "The default is pre-decided",
              "It's random",
              "It adds meetings"
            ],
            "zh": [
              "有趣",
              "默认已提前决定",
              "随机",
              "增加会议"
            ]
          },
          "answer": 1
        },
        {
          "q": {
            "en": "Best way to beat phone distraction?",
            "zh": "战胜手机分心的最佳方式？"
          },
          "options": {
            "en": [
              "Try harder",
              "Put it in another room",
              "Check it faster",
              "Buy a bigger phone"
            ],
            "zh": [
              "更努力克制",
              "放到另一个房间",
              "查得更快",
              "买更大的手机"
            ]
          },
          "answer": 1
        }
      ]
    }
  ]
}
