DragonCard
通用卡片学习框架

把知识放进去,
剩下的交给重复。

数据、模板、引擎三层解耦——
用自定义模板学习任何内容

DragonCard 不决定你的卡片长什么样,也不替你安排复习节奏。它只提供一个稳定的容器:你把知识放进去,然后每天来。

三层解耦 模板即一切 本地优先 · SQLite MIT 开源
Latin
spect / spic
词根 · 第 001 号
点击翻转 ↻
to look, to see
inspectTOP2k仔细检查
respectTOP2k尊重
spectatorSUPP观众
词源:Latin spectare — “to look”.
01 · 理念

DragonCard 不是 Anki。

它没有复杂的间隔重复算法,只有一种很简单的分类学习方法。

把知识快速呈现在你面前:标记未掌握的内容难点靠前熟词靠后。仅此而已。

它不替你安排复习节奏,也不承诺"多少天记住"。因为记忆的本质从来不是技巧,而是重复

记忆的本质从来不是技巧,
而是重复。

艾宾浩斯用一生证明:记忆的关键就是重复。所以我们相信的是你——你的坚持本身。

大脑是一个极其擅长偷懒的器官。当你长期坚持做同一件事,它不会一直停留在最初吃力的状态,而会逐渐演变成一件越来越省力的事。

DragonCard 利用的,正是这个机制——它提供的不是魔法,而是一个简单的容器:你把知识放进去,然后把"重复"这件最朴素的事,交给每天都来的自己。

持之以恒,必有收获。

我们不做承诺,只做容器。

DragonCard vs Anki

维度AnkiDragonCard
调度单元单张卡片独立计算下次复习时间完整有序列表为单元,靠排序实现优先级
时间约束严格日期驱动弹性,什么时候继续、间隔多久由使用者决定
熟词处理达标后降低复习频率,甚至退出复习池全程保留在列表尾部,轻量刷一遍维持记忆
优势理论记忆效率上限更高流程简单稳定、断卡后更容易续上、保留词条上下文顺序
短板任务量不可控,断卡后维护成本高不会精准在遗忘临界点触发复习,单条记忆效率理论上限略低

我们把自己的短板也写在表里。DragonCard 不追求理论上限,它追求的是——你还能坚持明天再来一次。

02 · 架构

数据、模板、引擎,三层解耦

一个 JSON 模板文件,定义一张卡片的一切。框架只提供"货架":学习流程与后端 API 固定不变。

用户提供 template.json(HTML + CSS + JS + lang + trackedActions)
DragonCard 加载模板 → 渲染卡片 → 注入 api 对象;学习引擎(标记 / 重排 / 分页)保持不变

数据只是数据

卡片内容是纯 JSON 数组,字段名由模板自己定义。想学什么,就填什么——没有任何预设的字段结构。

// cards.json —— 一个词条就是一条
[
  { "item_order": 1, "word": "spect / spic",
    "meaning_en": "to look, to see" },
  { "item_order": 2, "word": "dict",
    "meaning_en": "to say, to speak" }
]

模板定义卡片的一切

HTML 结构、CSS 样式、交互逻辑、发音语言、埋点事件——全部封装在一个 JSON 文件里。框架通过 window.cardTemplaterender / init / update 与它对话。

// template.json
{
  "name": "My Card",
  "lang": "en",                 // 决定 TTS 语音
  "cardHtml": "<div class=\"card\">…</div>",
  "cardCss": ".card { padding: 16px }",
  "cardJs": "window.cardTemplate = { render, init }",
  "trackedActions": [
    { "action": "audio_play", "label": "发音" }
  ]
}

引擎只做一件事:让你重复

标记未掌握 → 重排 → 多轮学习,进度自动持久化。它不认识你的内容,也不知道你在学英语还是化学——它只维护一个有序列表,和你在其中的位置。

// 学习引擎的固定流程
GET  /v1/learn/page   → 取一页卡片
POST /v1/learn/mark   → 标记未掌握
POST /v1/reorder      → 重排:难点靠前,熟词靠后
GET  /v1/rounds       → 进入下一轮
03 · 学习引擎

整套机制,就是这四步

下面这个列表是可以真的操作的。点几张卡标记为"未掌握",再点重排,看看会发生什么。

未掌握 0 已掌握 5 轮次 1

重排之后:未掌握的词条浮到前面,已掌握的沉到列表尾部——但不会消失,它们只是排在你后面,等下一轮轻刷一遍。

04 · 模板能力

一张卡片能自定义到什么程度

答案是:几乎全部。框架只要求你的模板暴露 render,其余交给你。

自定义 HTML / CSS / JS

结构、样式、交互全在你手里。Tailwind 工具类与 Font Awesome 开箱可用。

语言感知 TTS

模板声明 lang(en / ja / zh…),发音自动匹配对应语音,并按语言分组记忆。

最多 5 个动作 + 埋点

trackedActions 声明事件,框架自动统计,按模板隔离,可在观测页查看。

字段可隐藏

模板声明 fields,学习时可在字段抽屉里逐项开关,也可锁定不可隐藏的字段。

管理面板实时预览

上传模板即刻渲染真实卡片效果,边改边看,不用进学习模式。

本地优先

Flask + SQLite,开箱即用,数据在你自己的机器上,无需任何外部服务。

05 · 统计与成就

你的坚持,应该看得见

不为焦虑而设计,只是把"你来了多少次"如实画出来。

活动热力图

掌握度分布

未掌握模糊已掌握

轮次金字塔

越往上,走得越远
06 · 开始

让它跑起来,只需要一句话

安装依赖、建虚拟环境、改端口这些事,交给 AI 工具就好。把仓库交给下面任意一个,让它帮你跑起来。

跑起来之后,浏览器打开 http://localhost:5001 ——首次启动会自动建库、创建默认用户和一批入门模板,然后就可以新建卡组了。
07 · 这只是开始

它很简陋,而且是有意的

DragonCard 不是一款“功能齐全”的产品。它是作者基于一个朴素信念做出来的简单版本:把知识放进去,然后每天来。

它没有替你决定该学什么,也没有塞给你一堆用不上的功能。正因如此——它也可以是属于你的那一款

  • 数据是 JSON,模板也是 JSON。换一套模板,它就是另一款学习工具。
  • 想学什么,就让 AI 帮你生成:模板 + 数据一次给全,导入即用。
  • 不满意?让 AI 改样式、加字段、换交互——不用等作者更新。

如果你认同这个方向,但它还没有你想要的样子——那就把它交下去。

把仓库交给 WorkBuddyCodexOpenCode,直接告诉它:你想学什么

数据和模板是通用的——简单改造,它就能变成任何你想要的学习工具。