DragonCard
通用卡片学习框架

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

数据、小工具、引擎三层解耦——
用自定义小工具学习任何内容。

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

三层解耦 小工具即一切 本地优先 · SQLite MIT 开源
HSK 1 · 动
学习
xuéxí · 繁 學習
点击翻转 ↻
to learn · to study
学生HSK 1xuéshēng · 名
同学HSK 1tóngxué · 名
数学HSK 3shùxué · 名
同族词 —— 都含「学」(学习)。
01 · 理念

DragonCard 不是 Anki。

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

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

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

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

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

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

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

持之以恒,必有收获。

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

DragonCard vs Anki

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

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

02 · 架构

数据、小工具、引擎,三层解耦

一个卡组 = 一份数据 + 一个小工具。框架只提供"货架":学习流程与后端 API 固定不变。

用户提供 cards.json(字段随你定)+ 一个 zip 小工具(任意 HTML / CSS / JS)
↓
DragonCard 进入卡组时把卡片数据与 cardAPI 注入工具;学习引擎(标记 / 重排 / 分页 / 进度)保持不变

数据只是数据

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

// cards.json —— 一个词条就是一条(HSK 1–9 卡组)
[
  { "item_order": 1, "word": "学习", "pinyin": "xuéxí",
    "part_of_speech": "动", "definition": "to learn/to study",
    "traditional": "學習", "level": "1" },
  { "item_order": 2, "word": "朋友", "pinyin": "péngyou",
    "part_of_speech": "名", "definition": "friend",
    "traditional": "朋友", "level": "1" }
]

小工具定义卡片的一切

HTML 结构、CSS 样式、交互逻辑、发音语言、埋点事件——全部装在一个自包含的 H5 目录里,打包成 zip 上传即可。框架只通过 window.cardAPI 与它对话。

// 你的小工具 —— 任意 HTML / CSS / JS
var page = await cardAPI.getPage(1, 500);   // 取卡片
cardAPI.mark(card.id, true);            // 标记未掌握
cardAPI.favorite(card.id, true);        // 收藏
cardAPI.track('audio_play', card.id);     // 埋点
cardAPI.playAudio(card.data.word);        // 朗读

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

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

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

整套机制,就是这四步

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

未掌握 0 已掌握 5 轮次 1

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

04 · 小工具能力

一个小工具能自定义到什么程度

答案是:几乎全部。框架只要求工具能渲染卡片、并通过 cardAPI 取数据,其余交给你。

自定义 HTML / CSS / JS

结构、样式、交互全在你手里。宿主自带的 Tailwind、Font Awesome、Three.js 都能直接用。

语言感知 TTS

工具声明自己的语言(zh / en / ja…),发音自动匹配系统语音,并按语言分组记住用户的选择。

动作即埋点

任何交互都能用 cardAPI.track(action, itemId) 记一笔;框架按卡组聚合,在观测页画出热力图与动作统计。

零构建 · 上传即用

一个 zip 就是一个工具:管理页上传、绑定卡组,立刻可用。不用编译,不用装依赖。

一个工具,多个卡组

同一个工具可以被多个卡组复用,卡组只决定喂给它哪份数据。重新上传 zip 会保留 id、绑定关系与用户进度。

本地优先

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

05 · 统计与成就

你的坚持,应该看得见

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

活动热力图

少多

掌握度分布

未掌握模糊已掌握

轮次金字塔

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

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

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

跑起来之后,浏览器打开 http://localhost:5001 ——首次启动会自动建库、创建默认用户和一批默认卡组(每个卡组都已绑定自己的小工具),然后就可以开始了。
07 · 这只是开始

它很简陋,而且是有意的

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

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

  • 数据是 JSON,工具是一个 HTML/CSS/JS 目录。换一个小工具,它就是另一款学习工具。
  • 想学什么,就让 AI 帮你生成:小工具 + 卡组数据一次给全,导入即用。
  • 不满意?让 AI 改样式、加字段、换交互——不用等作者更新。

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

把仓库交给 WorkBuddy、Codex 或 OpenCode,直接告诉它:你想学什么。

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