Skip to content

Repository files navigation

LeafMark(一叶)

LeafMark,中文名“一叶”,是从 DRPA 知识文档体验中独立出来的本地文档应用,支持 Windows、Linux 与 Android。Markdown 保持完整编辑能力;Word、Excel、PowerPoint 与 PDF 使用本地只读查看器,文档不会上传到云端。

已实现

  • 本地目录直接作为文档库,不使用数据库或专有格式
  • 本地打开 .docx / .rtf.xlsx / .xls / .xlsb / .ods / .csv.pptx / .odp.pdf;Office 解析在独立 Worker 中运行,旧版 .doc / .ppt 可从保留副本交给系统应用
  • Office/PDF 打开后保存逐字节原件快照;源文件被删除后,历史与收藏仍可继续打开同一份文档
  • 默认进入所见即所得的实时渲染编辑;标题、引用、列表及粗体、斜体、删除线、行内代码和链接标记会立即原位成形
  • GFM:表格、任务列表、删除线、脚注与智能标点
  • KaTeX:$…$$$…$$\(...\)\[...\]math / tex / latex 围栏
  • Mermaid:完整 Mermaid 运行时,进入可视区域时才按需加载和绘制
  • 文档目录搜索、新建、重命名、删除、导入和本地链接跳转;空文件夹也会完整显示
  • 支持一次导入多篇 Markdown,或递归导入整个文件夹并保留原目录层级与空子目录
  • 导出 Markdown、带主题 HTML、无损高清 PNG、连续长页 PDF 或 A4 标准分页 PDF
  • PDF 使用可复制文字、系统中文字体子集与块级/行内矢量公式排版,不再把正文转换成图片
  • 外部文档打开后只编辑 LeafMark 私有副本,绝不回写微信等来源路径;文档库文件仍可正常保存
  • 自动保存串行化并对瞬时文件占用进行重试;UTF-8/UTF-16 读取、路径越界防护与安全 HTML 转义
  • 一叶绿、樱花粉、清川蓝、暖杏金和藤萝紫主题;每套均支持系统/浅色/深色模式
  • 本机字体、版心、字号、行高、动效和渲染能力设置
  • 不遮挡正文的停靠式文章大纲
  • Windows / Linux 自绘主题标题栏与本地化应用名称
  • Windows 资源管理器“打开方式”、右键打开与双击 .md / .markdown
  • Windows 启动、文件关联检测与默认应用设置全程不创建命令行窗口
  • Android 文件管理器、聊天、网盘等应用通过 ACTION_VIEWACTION_EDIT 或分享 Intent 打开 Markdown
  • Android 可把当前 Markdown 或导出的 HTML、PNG、PDF 作为真实文件发送到微信、邮件、网盘等应用
  • Android SAF 导出由原生 ContentResolver 提交并校验完整字节数,兼容本机 DocumentsProvider 与云盘 content:// 目标
  • Android 手机抽屉导航、触控热区、系统安全区与系统字体扫描
  • Android Agent 支持在系统默认浏览器登录 ChatGPT/Codex 等订阅;授权回调只监听本机 IPv4/IPv6 loopback,并提供重新打开与复制链接兜底
  • Android Agent 运行时使用可见前台服务、限时唤醒锁与增量任务日志;切到后台仍维持任务优先级,极端中断后会恢复已生成文本并安全收束文件版本
  • 最近打开历史与收藏;打开时自动保存独立文档副本,并可一键保存到我的文档库
  • 文档库、历史和收藏均提供右键菜单,可直接在系统文件管理器中定位源文档或保留副本
  • 源文件被移动或删除后,仍可从历史/收藏读取、编辑和导出保留副本
  • 类 VS Code 多文档标签栏;可在已打开文档间即时切换、查看未保存状态并单独关闭
  • 桌面端柔性 Dock 布局;文档库、历史、收藏、Agent 与大纲使用应用内指针拖放,可停靠上下左右、合并为页签并调整尺寸,不依赖 Windows WebView 的原生 HTML 拖放
  • 内置按需启动的流式文档 Agent;原生支持 ChatGPT/Codex、Claude、Gemini Code Assist 与 GitHub Copilot 订阅 OAuth,并完整提供 jcode 的 OpenAI-compatible provider catalog
  • 订阅模式分别使用 Codex Responses、Anthropic Messages、Gemini Code Assist 与 Copilot 协议,不会把订阅账户错误回退到按量 API Key
  • Agent 支持自动刷新登录、文档读写、并行只读子 Agent、会话检索、长期记忆、Skills、网页读取、Streamable HTTP MCP 和本机终端
  • Agent 可用 create / replace / append 方式把长篇 Markdown 直接流式写入目标标签;中止时保留已生成部分并可随整轮版本回退
  • Agent 每轮对话都建立不依赖 Git 的本地文件版本;消息、文档工具和 PowerShell 修改可一起回退或重做,重做不会再次执行命令
  • Windows 终端工具固定使用隐藏窗口 PowerShell;版本化回合采用可完整捕获的前台命令,支持超时和破坏性命令 Rust 级拦截,不会弹出黑色命令行

系统打开与文档保留

安装包会把 LeafMark 注册为 Markdown、Word、电子表格、演示文稿与 PDF 的打开方式。Windows 也可以进入“设置 → 系统集成”,注册 LeafMark 并打开 Markdown 默认应用确认页;Android 首次打开 Markdown 时,在系统“打开方式”选择器中选择 LeafMark,并可按需选择“始终”。

文档每次打开或保存时,LeafMark 都会在应用数据目录中更新独立快照。Markdown 副本可继续编辑;Office/PDF 保存逐字节原件并以只读模式打开。历史记录不是易失的路径列表:即使源文件已经不存在,保留副本仍然可读。清除历史只清理未收藏文档;收藏及其副本不会被批量清除。

Android 从其他应用收到的是临时 content:// URI。LeafMark 会先把内容复制到应用私有文档库,再建立历史/收藏快照,因此原应用撤销授权或删除源文档后仍可打开保留副本。

性能设计

  • pulldown-cmark 在 Rust 侧完成 Markdown → HTML,前端不维护 Markdown AST
  • Office 打开后先立即建立标签,再由专用 Worker 解析;Word 分段、表格按行、演示按页传回,避免把完整文档一次塞进 React
  • PDF 不经过 Office 文档解析器重排,直接交给系统 WebView 的 PDF 引擎;原件快照通过 Tauri asset protocol 在本机读取
  • 文档 Worker 只保留最近 4 个解析结果,OOXML 解压设置 96 MB XML 上限,应用层设置 512 MB 文件上限
  • 文件读取与渲染结果使用按修改时间失效的 LRU 缓存(12 篇 / 32MB)
  • 从资源管理器或微信冷启动时,首篇外部文档会随启动数据一次载入,避免先显示空白新建页再跳转
  • 目录扫描遵守 .gitignore.ignore.markignore,跳过隐藏目录和常见构建产物
  • Mermaid 和 KaTeX JavaScript 都是独立动态分块;普通文档不会下载或执行它们
  • Mermaid 使用 IntersectionObserver 提前 500px 懒渲染
  • Agent 不捆绑模型、jcode GUI、向量数据库或云端控制服务;只有用户发送消息时才连接所选 Provider,轻量记忆索引与 OAuth 账户状态保存在本机
  • 保存使用串行队列与同目录临时文件替换;遇到 Windows 索引器或杀毒软件瞬时占用会短退避重试
  • PDF 与 PNG 在独立 Worker 中排版/绘制/压缩,导出面板显示阶段进度并支持取消
  • PNG 只序列化一次页面,随后在后台分片绘制并流式压缩,避免重复排版或申请整页超大画布
  • Tauri 直接使用系统 WebView,不捆绑 Chromium;Rust release 使用 LTO、opt-level="z" 与 strip

开发

需要 Node.js 20+、Rust 1.77+ 和 Tauri 2 的平台依赖。Android 还需要 Android SDK 36、NDK 27 与对应 Rust Android target。

npm install
npm run tauri:dev

检查与构建:

npm run typecheck
npm test
cd src-tauri
cargo test
cd ..
npm run tauri:build

Android ARM64 APK:

npm run tauri -- android init
[IO.File]::WriteAllBytes(
  "$env:TEMP\leafmark-community-release-v1.jks",
  [Convert]::FromBase64String(
    (Get-Content .github\leafmark-community-release.jks.b64 -Raw).Trim()
  )
)
$env:ANDROID_KEYSTORE_PATH = "$env:TEMP\leafmark-community-release-v1.jks"
$env:ANDROID_KEYSTORE_PASSWORD = "leafmark-community-release-v1"
$env:ANDROID_KEY_ALIAS = "leafmark-community"
$env:ANDROID_KEY_PASSWORD = "leafmark-community-release-v1"
npm run tauri -- android build --apk --target aarch64 --split-per-abi

GitHub Release 只发布适用于现代 Android 手机的 arm64-v8a 优化 APK。发布构建会启用 Rust LTO/strip、R8、资源裁剪和原生库压缩,并在上传后自动验证 APK 只包含 ARM64 动态库且不超过 16 MiB。APK 固定使用公开的社区更新证书,发布前后都会校验证书指纹;更新 兼容性、风险说明与证书迁移规则见 Android 发布签名

下载

可以从 GitHub Releases 下载 Android APK、Windows NSIS 安装包、Linux AppImage 或 Debian 安装包。Android APK 是使用 固定 release 证书签名的优化构建;Windows 安装后可在 LeafMark 的“设置 → 系统集成”中完成 Markdown 默认应用确认。

旧 Android 包使用了无法恢复的临时 debug 证书,因此第一次迁移到固定签名版需要先备份文档、 卸载旧 APK,再安装一次;固定签名版之后的更新可直接覆盖安装。

发布工作流支持可选 Authenticode 代码签名。未配置证书时仍可生成安装包,但 Windows SmartScreen 可能显示未知发布者提示。证书配置见 Windows 发布签名

实时编辑说明

在“设置 → 编辑与保存”开启实时编辑后,工具栏会出现铅笔按钮。此模式直接编辑渲染后的内容,并持续转换回 Markdown。数学公式和 Mermaid 作为不可破坏的渲染块保留原始源码;编辑复杂公式、图表、脚注或表格结构时,建议临时切到源码或分栏模式。

项目结构

src/
  App.tsx                 应用状态、文件操作、Dock 与多文档标签
  agent-runtime.ts        流式 Agent 循环、文档工具与 MCP 客户端
  agent-providers.ts      jcode 对齐的 Provider catalog 与原生协议路由
  agent-storage.ts        本机会话检索与轻量语义记忆
  dock-layout.ts          桌面柔性 Dock 布局状态
  document-tabs.ts        多文档标签状态
  document-worker.ts      Word、表格与演示文稿隔离解析、分块缓存
  document-viewer-client.ts Office Worker 调度与本地 asset 读取
  rendering.ts            KaTeX / Mermaid 按需增强
  wysiwyg.ts              实时编辑 HTML → Markdown
  components/             文件树、历史收藏、Agent、Dock 与设置页
src-tauri/src/
  lib.rs                  扫描、渲染、缓存、文件系统与设置
  library.rs              历史/收藏索引与独立文档快照
  system_integration.rs   文件启动参数与系统文件关联状态
  agent_auth.rs           桌面/Android 订阅 OAuth、设备登录、令牌续期与账户状态
  agent_terminal.rs       无窗口 PowerShell / shell 前后台执行 harness
  agent_vcs.rs            Agent 原生 CAS、清单差分、事务回退与重做
src-tauri/gen/android/    Android Studio 工程、Manifest 与 Gradle 配置

Agent 本地版本格式、冲突行为和安全边界见 Agent 本地版本控制。 Office/PDF 的兼容范围、性能预算和安全边界见 0.7.7 文档引擎设计

About

LeafMark(一叶)— 高性能、轻量、本地优先的 Markdown 阅读与写作应用

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages