武汉大学 2024 级软件工程实训项目


白板笔记

自研 Markdraw 引擎 · 兼容 Excalidraw 格式
端到端加密协作 · AI 手写识别 · PDF 标注 · 鸿蒙手写笔压感

本网页仅为项目介绍,无实机展示
6+
平台支持
E2EE
端到端加密
离线
本地优先
无标题笔记
已保存
100%
纯 Dart
自研白板内核
AI 识别
手写转文本/图形
鸿蒙
原生压感适配

为创作而生

Markdraw 白板引擎

纯 Dart 自研白板内核,OneEuro 自适应滤波平滑笔迹,完整控制输入、渲染、撤销重做。不可变模型 + Result 模式,场景和元素都是不可变的,工具产出 ToolResult 由 EditorState 折叠成新状态。兼容 Excalidraw 数据格式,数据不被锁定,支持 .markdraw 和 .excalidraw 双格式导入导出。

实时协作 · 端到端加密

房间链接携带 roomId 和 roomKey,所有实时消息和快照用 AES-GCM-128 加密,服务端零知识中转永远看不到明文。Socket.IO 只广播 version 变化的增量元素,每 20 秒全量重发防止丢消息。协作者光标实时显示,新成员加入时主动推送最新场景。快照异步存储带乐观锁,冲突自动 reconcile 重试。

一处创作,随处访问

基于 Flutter 构建,一份 Dart 代码多端运行。鸿蒙端通过 Platform Channel 实现手写笔压感、Pen Kit 全局取色、原生 HTTP、PDF 渲染、语音识别和桌面服务卡片。

Android
macOS / iOS
Windows
Web
HarmonyOS
手写笔压感 · 全局取色 · 桌面卡片

为什么自研 Markdraw?

纯 Dart 白板内核 · 不可变模型 + Result 模式 · 兼容 Excalidraw

01

跨端一致性

Excalidraw 基于 Web/React 生态,无法直接运行在 Flutter。一份 Dart 代码多端运行,平台特有能力(鸿蒙手写笔压感、原生 PDF 渲染、语音识别)优雅降级。

02

分层状态管理

ChangeNotifier 处理高频笔迹输入,OneEuro 自适应滤波平滑跟手。Riverpod 管理业务逻辑和资料库,编辑流畅不卡顿。

03

端到端加密协作

房间密钥 AES-GCM-128 加密,增量同步变化元素而非全场景。高频书写帧合并,服务端零知识中转,完整场景仅用于初始化和快照恢复。

04

数据开放 · 离线优先

保持 Excalidraw JSON 格式兼容,用户数据不被锁定。本地 SQLite 存储,无服务端也能书写。支持 .markdraw 和 .excalidraw 双格式导入导出。

Flutter
Dart
Riverpod
SQLite
Socket.IO
Go
Excalidraw
HarmonyOS

一行行写出来的

从 2024 年实训启动至今,真实统计。没有营销水分。

0
行 Dart 业务代码
0
行测试代码
0
个 Dart 源文件
0
次代码提交
0
个原生平台
0
位核心贡献者

你可能想问的

还没解决?欢迎到 GitHub Discussions 继续聊。

是的。协作房间链接里携带 roomId 和 roomKey,密钥从不出客户端。 所有实时消息和快照用 AES-GCM-128 加密后发到服务器,服务器只看到密文, 永远无法解密还原内容。Socket.IO 只广播版本号和增量元素,服务端是零知识中转。
鸿蒙端通过 Platform Channel 接入 Pen Kit 全局取色和手写笔原生压感, 铅笔着色器模拟纸质纹理。iOS / Android 端通过 Flutter 的 PointerEvent 读取压感数据 (Apple Pencil 通过 UITouchType.Pencil,Android 通过 MotionEvent.getPressure)。
可以,而且这是设计目标。所有笔记存本地 SQLite 数据库,无服务端也能完整书写、 编辑、撤销重做。LibraryIndex 是单一数据源。需要同步时再连接协作服务或 WebDAV 云备份。
保持 Excalidraw JSON 格式兼容,用户数据不被锁定。支持 .markdraw 和 .excalidraw 双格式导入导出。这意味着你可以在 Excalidraw 网页版打开 FlowMuse 的笔记,也可以把 Excalidraw 的场景直接拖进 FlowMuse 继续编辑。
核心编辑能力完全一致(一份 Dart 代码)。鸿蒙端额外做了原生适配: 手写笔压感、Pen Kit 全局取色、 原生 HTTP / PDF 渲染、语音识别和 桌面服务卡片(从卡片可直接进入上次笔记)。
三平台实现策略不同。Android 端用 sherpa-onnx 离线模型, 笔迹特征完全在设备上推理,不上传。Web 端用浏览器原生 Web Speech API。 鸿蒙 端通过原生 MethodChannel 调系统 ASR。文本类识别走 OpenAI 兼容 Function Calling,会调用你配置的 API,但只在用户主动触发 AI 笔记助手时。

准备好开始了吗?

立即下载 FlowMuse,体验自由流动的白板创作