# inknote **Repository Path**: mars369/inknote ## Basic Information - **Project Name**: inknote - **Description**: 跨平台手写笔记本 —— 触控 · 手写笔 · 语音 · AI · 本地优先 · 自有网盘同步 · Word/PDF 格式互转 · .inote 单文件包。零依赖 Web 核心 + PWA/Tauri/Capacitor 五端覆盖。MIT License. - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-11-09 - **Last Updated**: 2026-11-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # InkNote **跨平台手写笔记本** —— 触控 · 手写笔 · 语音 · AI · 本地优先 · 自有网盘同步。 一套零依赖 Web 核心 + 多端壳:PWA 直接覆盖五端浏览器,Tauri 2 出 Windows / macOS / Linux 原生包,Capacitor 出 Android / iOS 原生包。手写、语音、AI、同步这些能力只写一遍。 [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) ## 特性 ### 单文档 · 多层墨水 一页笔记即一个文档,四层叠放: | 层 | 内容 | |---|---| | 背景层 | 点阵纸(可隐藏) | | 文本层 | contenteditable 富文本,撑开整页 | | 墨迹层 | 透明 canvas,笔迹叠在文字上,同一坐标系 | | 提示层 | 空页引导、书写状态 | 文字和笔迹共享同一坐标系:滚动页面时笔迹与文字一起移动,永不错位。 ### 触控与手写笔 - Pointer Events 统一鼠标 / 手指 / 触控笔 - 压感(`pressure`)、倾斜(`tiltX/Y`)、`getCoalescedEvents()` 高频采样变宽笔迹 - 钢笔 / 签字笔 / 荧光笔 / 整笔橡皮擦除 - **手掌防误触**:用笔时手指自动忽略 - 撤销 / 重做,矢量笔划持久化(可继续编辑) - **AI 手写识别**:墨迹层一键转文本,识别结果纳入全文搜索并进入 AI 上下文(接入任意多模态模型:gpt-4o / qwen-vl / llava…) ### 笔记组织 - 文件夹分类(侧栏筛选 + 每篇笔记归属) - 置顶常用笔记 - 模板新建:会议纪要 / 待办清单 / 康奈尔笔记 / 日记 ### 语音 - Web Speech API 实时转写(写入光标处并留存转写稿) - MediaRecorder 录音存档,笔记内嵌播放卡片 - **录音-笔迹回放**:录音期间写下的笔迹带时间戳,播放时可按进度重现「当时写了什么」,可拖动定位 ### AI(可插拔) - 离线演示模式(无密钥即可体验) - OpenAI 兼容接口 / Ollama 本地模型 / 本地桥代理(密钥不落前端) - 摘要 · 提纲 · 续写 · 润色 · 标题生成 · 基于当前笔记问答,结果一键插入 ### 本地优先 · 数据自主 - IndexedDB 自动保存(`file://` 打开时自动降级 localStorage) - File System Access API 绑定本地文件夹直存 - 数据格式全部开放:JSON、向量墨迹、扩展 Markdown ### 自有网盘同步 - WebDAV 通用协议:坚果云 / Nextcloud / 群晖 / 自建均可 - `bridge.mjs` 本地桥绕开浏览器 CORS,集中保管凭据 - 三方合并:双端都改时保留「冲突副本」,不静默覆盖 ### 格式互转 所有外部格式与统一块模型双向映射,导入后就是普通笔记,可再导出任意格式: | 格式 | 导入 | 导出 | |---|---|---| | Word `.docx`(OOXML) | ✅ | ✅ | | PDF(Canvas 分页渲染 / 文本层抽取) | ✅ | ✅ | | HTML(图片内嵌 data URL) | ✅ | ✅ | | Markdown / TXT | ✅ | ✅ | | `.inote` 单文件包 | ✅ | ✅ | ### `.inote` 单文件笔记包 扩展 Markdown(IMD v1)+ ZIP:文字、图片、语音、视频、转写稿、手写墨迹全部压进一个文件。任何解压工具都能打开;普通 Markdown 阅读器仍能正常显示文字与图片。 ```markdown ![示例图片](assets/b6bd….png) !audio[会议录音](assets/c93e….webm){"id":"aud-1","lang":"zh-CN","duration":183} !video[演示](assets/9198….mp4){"id":"vid-1","duration":42} !ink[手写批注](ink.svg){"strokes":12,"data":"ink.json"} ``` 格式规范见 [FORMAT.md](FORMAT.md),转换矩阵见 [CONVERT.md](CONVERT.md)。 ## 快速开始 ```bash git clone https://gitee.com/<你的空间>/inknote.git cd inknote node bridge.mjs # 或 npm start ``` 浏览器打开 。 不启动桥也可以:任意静态服务器托管本目录即可(甚至直接双击 `index.html`,数据降级存 localStorage)。 ### 命令行工具 ```bash node verify.mjs # 完整性校验(DOM/图标/模块/功能探针) node pack.mjs selftest # .inote 单文件包自检 node pack.mjs info|verify|unpack [dir] node convert.mjs selftest # 格式互转自检(39 项) node convert.mjs to <输入> <输出> # .inote/.docx/.html/.md/.txt 互转 node convert.mjs inspect # 识别任意支持格式 ``` ### 配置 复制 `bridge.config.example.json` 为 `bridge.config.json`,或在应用「同步」「设置」面板里直接填写: - **网盘**:WebDAV 地址、账号、应用密码 - **AI**:OpenAI 兼容 baseUrl / apiKey / model,或 Ollama - **局域网访问**(手机同 Wi-Fi):环境变量 `INKNOTE_HOST=0.0.0.0`,并必须设置 `INKNOTE_TOKEN` ## 五端打包 | 平台 | 方案 | 命令 | |---|---|---| | Windows / macOS / Linux | Tauri 2 | `npm i && npm run tauri:build` | | Android | Capacitor | `npm i && npm run cap:add:android && npm run cap:open:android` | | iOS | Capacitor | macOS 上执行 `npm run cap:add:ios` | | 全平台(免打包) | PWA | 浏览器安装到主屏幕 / 独立窗口 | ## 架构 ``` index.html 入口 + 四层文档结构 app.css 样式(明暗主题、响应式) js/db.js IndexedDB(含 file:// 降级) js/ink.js 手写引擎(Pointer Events、压感、防误触) js/speech.js 语音转写 + 录音 js/ai.js 可插拔 AI Provider js/sync.js WebDAV 同步(三方合并) js/io.js Markdown / SVG / PNG / JSON 导入导出 js/pack.js 零依赖 ZIP + IMD v1 扩展 Markdown js/convert.js 统一块模型 + HTML/MD/TXT 互转 js/docx.js Word OOXML 读写 js/pdf.js PDF 容器(Canvas 分页)+ 文本层抽取 js/app.js 编排层 bridge.mjs 静态托管 + WebDAV/AI 代理(Node,零依赖) src-tauri/ Tauri 2 桌面端配置 capacitor.config.json 移动端配置 ``` - **零依赖**:前端无构建、无 npm 运行时依赖;`npm` 仅用于 Tauri/Capacitor CLI - **无框架**:原生 HTML/CSS/JS,IIFE 模块挂 `window.NB` - **数据可迁移**:所有格式开放且有规范文档 ## 已知边界 - Web Speech API 在部分 iOS / 桌面浏览器不可用(可外接 ASR) - 手写识别需自行接入多模态模型(识别质量取决于所接模型) - WebDAV 同步只传笔记 JSON;跨设备交换媒体请导出 `.inote` 再导入 - Word 中音视频为占位说明(完整媒体走 `.inote`);Word 表格导入展开为文本 - PDF 默认版文字不可选(提供「可选文字」打印视图);扫描件需 OCR ## 贡献 欢迎 Issue 与 PR。提交前请跑通 `node verify.mjs`、`node pack.mjs selftest`、`node convert.mjs selftest`。 ## 许可 [MIT](LICENSE) ## 国际化(v1.4.0 · International) InkNote 现在是一个**多语言应用**,内置 5 种语言,开箱自动检测系统语言: | 语言 | 代码 | 覆盖 | |---|---|---| | 简体中文 | `zh-CN` | 全部界面 + 模板 + 欢迎笔记 + AI 提示词 | | English | `en` | 全部界面 + 模板 + 欢迎笔记 + AI 提示词 | | 日本語 | `ja` | 全部界面 + 模板(内容模板回落英文) | | Español | `es` | 同上 | | Deutsch | `de` | 同上 | - 切换入口:**设置 → 语言 / Language**,选择后自动重载生效 - 实现零依赖:`js/i18n.js` 单文件词典(约 340 键 × 5 语言),HTML 用 `data-i18n` / `data-i18n-ph` / `data-i18n-title` / `data-i18n-html` 标注,JS 用 `NB.i18n.t(key, ...args)` - 回落链:当前语言 → `en` → `zh-CN`,词典缺键永不白屏 - 价格、日期格式、文件夹排序(`localeCompare`)随语言本地化 - AI 提示词与离线演示输出中英双套,按界面语言自动选择 - 新增语言 = 新增一个词典对象 + 在 `LANGS` 里注册,欢迎 PR ## 支持与定价(Support / Pricing) 应用内新增「支持」面板与官网定价页(`site/index.html`)。核心原则:**付费只买便利,绝不锁功能**。 | 项目 | 国际定价 | 国内定价 | 说明 | |---|---|---|---| | 核心应用 | **$0**(MIT 开源) | ¥0 | 全部笔记功能 | | 支持者版 Supporter Pack | **$2.99 一次性** | ¥12 | 五端一键安装包 + 自动更新 | | 托管同步 Hosted Sync | **$0.99/月 · $6.99/年** | ¥1/月 · ¥8/年 | 端到端加密,免自建 | | Pro 桌面套件 | **$9.99 一次性** | ¥29 | 批量转换 + 离线 OCR | 对比:GoodNotes Pro $35.99/年、Notability Pro $79.99/年——均为年付订阅;InkNote 最贵单品 $9.99 一次性。价格按区域本地化($/¥/€/円)。 ## 海外版与运营(International Edition) - 官网落地页:`site/index.html`(英文,含 SEO/OG/JSON-LD、定价锚点 `#pricing`、竞品对比表、FAQ) - 海外主仓库:GitHub `https://github.com/mars369/inknote`(Gitee 为国内镜像) - 发布节奏与渠道计划见 `OPERATIONS.md` - 语言切换演示:设置面板第一个分区