当前位置: 首页 > article >正文

开源首发:DocCenter — AI 时代的 HTML工作台深度解析

TagsPythonaiohttp开源项目AI工具前端工程工具分享ClaudeChatGPT专栏「工具开源」/「DocCenter」一、痛点AI 时代的文档散落病过去一年我每天被 AI 生成的 HTML 文件淹没。Claude artifacts 一天 20 个、ChatGPT canvas 一天 10 个、Cursor / CodeBuddy 生成的报告一天 5-8 个。它们散落在十几个文件夹里双击只能看改一个错字得翻出原始 prompt 重跑一遍找历史版本找不到。我试过几条路都不通方案不通在哪VSCode看 HTML 要预览插件编辑富文本得切到源码模式Notion不接受 HTML 上传复制粘贴丢失样式浏览器收藏夹不能编辑不能批注自建静态站太重每次都要 build deploy所以我写了DocCenter一个跑在localhost:9901的本地工作台专门治这个病。仓库地址https://github.com/louisecxqiu-glitch/html-doc-center二、技术选型为什么是单 Python 文件 vanilla JSDocCenter 整个后端是一个server.py零requirements.txt唯一外部依赖是aiohttp。前端是 vanilla JS没有构建步骤。这不是炫技是有意为之。三个关键决定2.1 选 aiohttp不选 FastAPI维度aiohttpFastAPI冷启动0.3s1.5spydantic 加载内存~30MB~80MB心智负担一个web.RouteTableDef完事还要懂 Pydantic models工作台不是产品是自己每天用的工具。冷启动快、内存小比规整 OpenAPI 文档重要 100 倍。我自己 Mac 上同时还跑着 dashboard9900、心跳4011、cockpit8088……每个都吃 80MB 我不答应。2.2 选 vanilla JS不选 React零构建 零心智负担。修一个 bug 不需要npm install→npm run build→ 刷新而是改 → CmdShiftR。唯一嵌入的依赖是marked.min.jsMarkdown 渲染MIT平铺在web/vendor/。整个web/目录 8 个文件就是全部前端代码。2.3 选 iframe不选 SPA 路由被编辑的 HTML 文件是完整页面——它有自己的 CSS 动画、JS 交互、外链字体。如果把它的 body 抠出来塞进 SPA那些上下文全丢了。iframe 让每篇文档保留完整运行时DocCenter 只在它的/body前注入一段saver-runtime.js提供编辑工具栏和自动保存能力。保持原文件运行时不被污染是 v1.0 就立的规矩。三、核心架构三段式┌─────────────────────────────────────────────────────────────┐ │ Browser at localhost:9901 │ │ │ │ ┌─────────────────┐ ┌──────────────────────────────────┐ │ │ │ web/app.js │ │ iframe │ │ │ │ (sidebar tree) │ │ ┌────────────────────────────┐ │ │ │ │ │←─→│ │ users HTML │ │ │ │ │ │ │ │ injected saver-runtime.js│ │ │ │ └─────────────────┘ │ └────────────────────────────┘ │ │ │ ↕ HTTP JSON └──────────────────────────────────┘ │ └─────────┼───────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ server.py (aiohttp, single file) │ │ ┌───────────┬──────────────┬──────────────────────────────┐│ │ │ Static │ Tree/Config │ HTML Read/Write ││ │ │ / │ /api/tree │ /api/file (inject saver) ││ │ │ /static/* │ /api/config │ /api/snapshot ││ │ │ /changelog│ │ /api/save (overwrite/new/ ││ │ │ │ │ discard) ││ │ └───────────┴──────────────┴──────────────────────────────┘│ └─────────────────────────────────────────────────────────────┘3.1 后端 server.py路径安全是唯一硬约束所有 I/O handler 都必须先过_resolve_safe()把传入路径 resolve 成绝对路径再校验它在某个scan_root之下否则返回 403。def_resolve_safe(raw:str,scan_roots:list[str])-Optional[Path]:The single gate for path traversal defense.try:targetPath(raw).expanduser().resolve()except(OSError,RuntimeError):returnNoneforrootinscan_roots:root_pathPath(root).expanduser().resolve()iftargetroot_pathorroot_pathintarget.parents:returntargetreturnNone# caller returns 403新增任何 I/O handler 都禁止绕过它——这是 v1.0 就定下的硬规矩到 v1.11.11 都没破例。scan_roots配置在~/.codebuddy/html-doc-center/config.json前端设置面板可增删。默认排除_auto-save / node_modules / .git / dist / build等。3.2 saver-runtime.js脏状态监听的三道护栏这是项目最难的一段。dirty 检测必须只在用户主动编辑时为 true不能被页面 JS 动画 / scroll / 高亮触发。// 护栏 1用户交互窗口constUSER_INTERACT_WINDOW_MS800;letlastInteract0;[keydown,mousedown,paste,cut,drop].forEach(evdocument.addEventListener(ev,(){lastInteractDate.now();},true));// 护栏 2MutationObserver 配置只看 childList characterDataconstmonewMutationObserver(mutations{if(Date.now()-lastInteractUSER_INTERACT_WINDOW_MS)return;if(mutations.some(mm.target.tagNameSCRIPT||m.target.tagNameSTYLE))return;setDirty(true);});// 护栏 3延迟 1 秒 observe避开页面初始化setTimeout((){mo.observe(document.body,{childList:true,characterData:true,subtree:true// 严禁 attributes: true会被动画/滚动高亮误报});},1000);这三道护栏是 v1.2.4 一次脏状态误报 bug 后立的至今没退化。修改这段代码前必读注释——容易被看似优化地打开attributes: true立刻退化。3.3 前端 app.js唯一的 UX 决策点是三选一对话框切换文件 / 关闭 / 刷新时若isDirtytrue弹出┌─────────────────────────────────────────┐ │ 你修改了文档 │ │ │ │ ✅ 覆盖源文件 │ │ 另存为审阅版 │ │ 丢弃修改 │ └─────────────────────────────────────────┘整个 UX 只有这一个决策点。v1.2.5 我尝试加过第四个 按钮“保存并继续编辑”实测后立刻撤了——决策点越多用户越累。少即是多不是口号是每次想加按钮时都得过的关。四、5 条反 Bug 铁律项目沉淀v1.0 → v1.11.11 连续 42 版迭代踩了一堆坑。其中 v1.11 系列连续 11 次 hotfix 把我教育到位逼出 5 条铁律全部写进ITERATION-SOP.md铁律 1真实浏览器演练 ——「curl 200」≠「用户视角能用」反面案例v1.11.10三 Tab 切换功能curl 返回 200lint 0 错误我宣称完成。用户实测切到「收藏」「最近」Tab 显示空白。根因CSS 的.active { display: block }干不过 inline 的styledisplay:noneHTML 里有历史残留。铁律commit 前必须在浏览器硬刷新CmdShiftR 用户视角点 3 个核心交互。验收报告不能只贴 curl 200要写我在浏览器点了 X 看到了 Y。铁律 2守卫表达式必须显式验证反面案例v1.11.11if (window.sidebarTabsCtl)永远 false因为sidebarTabsCtl是 IIFE 内的const从未挂到window上。// ❌ 永远进不来(function(){constsidebarTabsCtl{activate:...};})();if(window.sidebarTabsCtl){...}// false forever// ✅ 闭包内直接引用(function(){constsidebarTabsCtl{activate:...};functiononClick(){sidebarTabsCtlsidebarTabsCtl.activate(tree);}})();铁律写if (X)前确认 X 在该 scope 的真实可见性。铁律 3CSS 改 .active / display 前 grep inline style 残留铁律CSS 优先级 inline id class tag。改新 class 控制显示前先grep旧 HTML 是否有同名 inline style“display:none” 残留——它会压住 CSS。!important是最后一招。铁律 4DOM 切换后的依赖动作必须用 rAF反面案例v1.11.11点击收藏目录 →activate(tree)切 display → 立刻scrollToPath()算位置 → 在旧布局上算 → 视觉零反馈。// ❌ 在旧布局上算位置sidebarTabsCtl.activate(tree);scrollToPath(path);// getBoundingClientRect returns stale values// ✅ 等下一帧sidebarTabsCtl.activate(tree);requestAnimationFrame((){scrollToPath(path);});铁律 5自驱模式 ≠ 跳过用户视角用户说自驱不要打断指的是不要发决策卡片不是免除验收。每 2-3 个版本最少一次假装我是用户演练。CHANGELOG 用户故事段写得越漂亮越要在浏览器里真实验过——否则就是文档自我催眠。五、Quick Start v1.12 RoadmapQuick Start3 行gitclone https://github.com/louisecxqiu-glitch/html-doc-center.gitcdhtml-doc-center pip3installaiohttppython3 server.py# → 打开 http://localhost:9901macOS 开机自启cplaunchd.plist.example ~/Library/LaunchAgents/com.louis.html-doc-center.plist launchctl load ~/Library/LaunchAgents/com.louis.html-doc-center.plistv1.12 Roadmap计划中全文搜索FTS5 防抖HTML 块级编辑增强拖拽重排、批量样式多窗口同步一个文件多 tab 打开时的状态广播移动端触屏阅读模式侧栏抽屉化详见docs/superpowers/plans/2026-05-14-v1.12-roadmap.md。六、仓库与联系方式⭐GitHub: https://github.com/louisecxqiu-glitch/html-doc-center Issues / Discussions / PRs 都欢迎 —— 见 CONTRIBUTING.mdConnect 「一深思AI」—— 配套深度文章《养虾系列》AI Agent 实战方法论 CSDNblog.csdn.net/qcx23 X / Twitterlouisqiu285052如果这工具对你有用star 一下是对开源最好的支持。Issue / PR 都欢迎慢慢养。Built with ❤️ by Louis Qiu · MIT Licensed · 路易乔布斯 © 2026

相关文章:

开源首发:DocCenter — AI 时代的 HTML工作台深度解析

Tags:Python aiohttp 开源项目 AI工具 前端工程 工具分享 Claude ChatGPT 专栏:「工具开源」/「DocCenter」 一、痛点:AI 时代的文档散落病 过去一年,我每天被 AI 生成的 HTML 文件淹没。 Claude artifacts 一天 20 个、ChatGPT…...

React Hook useVibe:声明式时序管理与交互感知的工程实践

1. 项目概述:一个能“感知”用户意图的React Hook 最近在做一个需要深度交互的前端项目,遇到了一个挺有意思的痛点:如何让UI组件不只是被动地响应事件,而是能更“聪明”地理解用户的交互意图,甚至预判下一步操作&#…...

开源首发:DocCenter — 本地 HTML 工作台,治好 AI 时代的文档散落病

Tags:Python aiohttp 开源项目 AI工具 前端工程 全栈 工具分享 一、痛点:AI 时代的文档散落病 (对比传统文档管理 vs AI 生成文档的区别,说明为什么 VSCode/Notion 都不合适) 二、技术选型:为什么是单 Pyth…...

从手机解锁合法化看DMCA、消费者权利与设备所有权的博弈

1. 从“越狱”到合法化:一场关于设备所有权的消费者权利运动2013年初,如果你在美国买了一部合约机,然后想把它带到另一家运营商使用,你面临的不仅仅是不兼容的技术问题,还可能是一项重罪——最高五年的监禁和五十万美元…...

测试环境搭建指南:从零开始构建完善的测试体系

测试环境搭建指南:从零开始构建完善的测试体系 前言 各位前端小伙伴,不知道你们有没有这样的经历:在自己电脑上测试好好的,一到CI环境就各种失败。 我曾经因为测试环境和生产环境不一致,导致线上出现了一个严重bug。后…...

终极指南:如何在Mac上快速安装配置DistroAV网络视频插件 [特殊字符]

终极指南:如何在Mac上快速安装配置DistroAV网络视频插件 🚀 【免费下载链接】obs-ndi DistroAV (formerly OBS-NDI): NDI integration for OBS Studio 项目地址: https://gitcode.com/gh_mirrors/ob/obs-ndi 想要在多台电脑之间轻松传输高质量的音…...

LinkedIn Liger Kernel:移动设备内核定制与性能优化实战

1. 项目概述:一个面向移动设备的开源内核探索如果你在移动设备开发、嵌入式系统或者内核研究的圈子里待过一段时间,大概率听说过或者接触过“Liger Kernel”这个名字。它不是一个商业产品,而是一个在GitHub上由LinkedIn开源并维护的Android内…...

RAG和向量索引

为特定用例设计代理时,需要确保语言模型已建立基础并使用与用户所需内容相关的事实信息。 虽然语言模型针对大量数据进行了训练,但它们可能无权访问你想要向用户提供的知识。 若要确保代理基于特定数据提供准确且特定于域的响应,可使用检索增…...

做电力仪器选显示屏踩坑3年,终于摸透这四个选型标准

我是电力仪器设备厂的生产测试主管,干这行快7年了,前前后后负责过继保测试仪、变比测试仪、互感器校验仪等七八款产品的配件选型,光显示屏就换过四家供应商,踩过强电磁下跳数、低温黑屏、交期拖垮项目的坑,直到用上恒域…...

10个免费Illustrator脚本:让你的设计效率提升300%的终极工具集

10个免费Illustrator脚本:让你的设计效率提升300%的终极工具集 【免费下载链接】illustrator-scripts Adobe Illustrator scripts 项目地址: https://gitcode.com/gh_mirrors/il/illustrator-scripts 如果你经常使用Adobe Illustrator进行设计工作&#xff0…...

系统稳定性测试利器:Roast烤机工具原理与实践指南

1. 项目概述:一个为“烤”而生的开源工具最近在折腾一些自动化任务时,发现了一个挺有意思的开源项目,叫sumleo/roast。光看名字,你可能会联想到“烤肉”,但在程序员的世界里,这个“roast”可不是让你去烧烤…...

Windows 一键部署 OpenClaw 教程|5 分钟搭建本地 AI 智能体,轻松搞定复杂配置

OpenClaw 2.7.1 接入阿里云百炼超详细图文教程 📋 前置准备 本地已安装并能正常运行 OpenClaw 2.7.1 WindowsOpenClaw 顶部 Gateway 保持在线状态拥有可正常登录的阿里云账号网络可正常访问阿里云百炼控制台: https://bailian.console.aliyun.com/cn-be…...

滑动窗口(数组)

作用滑动窗口&#xff1a;求连续满足条件的最短子数组代码模板int left 0; int right;//外层循环扩展右边界&#xff0c;内层循环扩展左边界 for (right 0; right < n; right) {//获取当前考虑的元素while (left < right && check()) {//区间[left,right]不符合…...

Claude Markdown增强资源库:提升AI文档生成质量与效率

1. 项目概述&#xff1a;为什么我们需要一个“Claude Markdown 增强”资源库&#xff1f; 如果你和我一样&#xff0c;是 Claude 的深度用户&#xff0c;并且经常用它来辅助编程、撰写文档或整理知识&#xff0c;那你一定遇到过这个痛点&#xff1a;Claude 输出的 Markdown 代…...

Python 爬虫进阶技巧:JSON 数据多层嵌套解析取值技巧

前言 在现代网络数据采集场景中,JSON(JavaScript Object Notation)已成为前后端数据交互的核心格式,绝大多数动态网页、API 接口均采用多层嵌套 JSON 结构传输数据。对于爬虫开发者而言,基础的 JSON 取值仅能应对简单数据结构,而面对深度嵌套、数组嵌套、混合嵌套等复杂…...

自动化知识库构建工具:从多源聚合到持续部署的工程实践

1. 项目概述&#xff1a;一个面向开发者的自动化知识库构建工具最近在折腾个人知识管理和团队文档沉淀时&#xff0c;发现了一个挺有意思的开源项目&#xff0c;叫devp1/autopedia。乍一看这个名字&#xff0c;可能会联想到“自动百科全书”&#xff0c;但它的定位其实更精准&a…...

claw-installer:构建自动化部署脚本的工程实践与设计哲学

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目&#xff0c;叫claw-installer。这名字乍一看有点抽象&#xff0c;但如果你对自动化部署、特别是那些需要处理复杂依赖和配置的应用感兴趣&#xff0c;那这个工具很可能就是你一直在找的“瑞士军刀”。简单来说&#xff…...

Python 爬虫进阶技巧:定时爬虫任务实现无人值守采集

前言 常规爬虫多依赖手动触发脚本运行,单次采集完成后需人工二次启动,无法满足日常周期性数据监控、行情抓取、资讯同步、业务台账定时归档等常态化采集需求。搭建可自主调度、自动启停、周期循环的定时爬虫任务,脱离人工干预实现无人值守全自动采集,是爬虫从临时脚本走向…...

终极解决方案:3分钟搞定百度网盘提取码的免费自动化工具

终极解决方案&#xff1a;3分钟搞定百度网盘提取码的免费自动化工具 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘资源下载卡在提取码这一步而烦恼吗&#xff1f;每次遇到需要密码的分享链接&#xff0c;都要…...

免费豆包大模型API代理部署指南:原理、实战与安全实践

1. 项目概述&#xff1a;一个免费且强大的大模型API代理 最近在折腾大语言模型应用开发的朋友&#xff0c;估计都绕不开一个核心痛点&#xff1a;API调用成本。无论是OpenAI的GPT系列&#xff0c;还是国内外的其他主流模型&#xff0c;按Token计费的模式在频繁调试和原型验证阶…...

游戏交易税、年龄锁与拒付账单:APP出海全球合规风暴

上周&#xff0c;监管与平台的合规重拳&#xff0c;密集落在了游戏交易、未成年人保护和支付链条上。几项变化直接且锋利&#xff0c;对出海游戏厂商而言&#xff0c;已不再是远期预警&#xff0c;而是迫在眉睫的执行项。 美国州级监管&#xff1a;直指游戏内购与停服责任 科…...

基于苏格拉底式提问的LLM深度推理:从概念澄清到工程实践

1. 项目概述&#xff1a;当AI学会“苏格拉底式提问”最近在探索如何让大语言模型&#xff08;LLM&#xff09;的推理能力更上一层楼时&#xff0c;我遇到了一个非常有意思的开源项目&#xff1a;jumasheff/socratic-rules。这个名字本身就充满了哲学与技术碰撞的火花——“苏格…...

AI系统行为治理:构建确定性护栏与运行时安全控制

1. 项目概述&#xff1a;为AI系统构建确定性的行为护栏如果你正在构建一个会“动手”的AI应用——无论是能帮你写代码的智能助手&#xff0c;还是能操作数据库的自动化流程&#xff0c;甚至是部署在物理设备上的机器人——那么你迟早会面临一个核心问题&#xff1a;如何确保它只…...

AMD Carrizo架构解析:SoC集成与HSA异构计算如何重塑移动处理器

1. 从“胶水粘合”到“原生融合”&#xff1a;Carrizo与Carrizo-L的架构革命2014年底&#xff0c;当AMD在新加坡的“计算的未来”活动上拿出Carrizo和Carrizo-L这两颗芯片时&#xff0c;现场的反应可能比预想的要平静一些。毕竟&#xff0c;对于习惯了每年“挤牙膏”式升级的行…...

AgenticTime:为AI智能体设计的时间推理引擎与.atime文件格式详解

1. 项目概述&#xff1a;为AI智能体赋予时间感知能力如果你用过Claude、GPT或者任何基于大语言模型的AI助手&#xff0c;肯定遇到过这样的场景&#xff1a;你告诉它“周五前要完成API评审”&#xff0c;它当时答应得好好的&#xff0c;但当你隔天再问“我这周有什么要紧事”时&…...

传统企业XaaS转型实战:从商业模式重构到运营模型落地

1. 云服务转型的十字路口&#xff1a;从“卖盒子”到“卖服务”的本质跨越在过去的十几年里&#xff0c;我亲眼见证了“云”从一个时髦的技术概念&#xff0c;演变为驱动几乎所有行业数字化转型的核心引擎。无论是初创公司还是百年老店&#xff0c;都在谈论上云、用云、管云。但…...

2026最新版|音频格式转换超详细全攻略:8种方法和避坑指南

你是否有过这样的经历——从录音笔导出的WAV文件体积太大无法发送&#xff0c;下载的FLAC无损音乐在车上无法播放&#xff0c;或者视频剪辑时发现音频格式不被软件识别&#xff1f;这些场景都会用到音频格式转换。本文基于2026年最新可用工具&#xff0c;把8种转换方法极度细化…...

小白必看!3个月从零基础到AI大模型工程师,独家学习路线助你轻松上岸!收藏不迷路!

本文分享了作者从计算机小白成功转行AI大模型工程师的亲身经历&#xff0c;并提供了独家学习路线。文章指出企业更看重能实际应用Python搭建AI智能体、用Java迭代项目的技能&#xff0c;而非死磕算法和公式。作者建议先掌握Python基础、建立对大模型的基本认知、磨练Prompt技巧…...

用 C 语言函数表实现通信传输层抽象

用 C 语言函数表实现通信传输层抽象 在嵌入式 Linux 或工业控制类程序中&#xff0c;一个应用经常需要同时接入多种通信链路&#xff0c;例如 UDP、串口、CAN、TCP 或 Unix Socket。 这些链路的底层实现差异很大&#xff1a; UDP 基于 socket串口基于 tty 设备CAN 基于 SocketC…...

【光栅和蛇形误差扩散半色调】基于Floyd-Steinberg算法进行误差扩散半色调研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...