标签 markdown 下的文章

摘要:
本文介绍如何为开源个人AI助手 Moltbot(原 ClawdBot)集成基于 OceanBase 技术栈的长期记忆插件 PowerMem。通过 HTTP API 对接,PowerMem 为 Moltbot 提供智能信息抽取、艾宾浩斯遗忘曲线调度及多智能体隔离的记忆能力,显著增强其上下文持久化与自主决策水平,实现更类人的“数字员工”体验。 

Moltbot 是什么?


Clawdbot(后更名为 Moltbot,又更名为 OpenClaw)是一款开源、以通讯为核心的AI智能体项目,运行在你自己的设备上,通过你已有的渠道(WhatsApp、Telegram、Slack、Discord、Google Chat、Signal、iMessage、Teams、WebChat 等)和你对话,支持语音、Canvas、多代理路由等。 简单点说:Moltbot 最大的特点是不仅能回答问题,更能真正“动手”操作你的电脑系统,执行命令、控制浏览器、管理文件,就像一个 7 x 24 小时在线的 “数字员工”。 

官网 :https://www.molt.bot/
github 地址:https://github.com/moltbot/moltbot
 

Moltbot 部署

方式一:NPM 全局安装

方式二:源代码安装

上面两种安装方式二选一,因为我是走的源代码安装:
1.     pnpm moltbot onboard --install-daemon 初始化

2.     同意风险
提示这里会让你确认风险。Moltbot 功能强大,能执行系统命令、读写文件、控制浏览器,但这也意味着如果配置不当或被滥用,可能会带来安全风险,请谨慎使用。

3.     选择快速开始
4.     配置 AI 模型授权,我手里头有qwen的

5.     启动web问个小问题:“查一下我的电脑型号”,很快 moltbot 回复了我机器的具体型号,虽然任务非常简单,但是还是挺惊喜的,距离“贾维斯”又进了一步了。

Moltbot 的原生记忆解读

Moltbot 的持久记忆可以概括为:「Markdown 文件为单一事实来源 + 可选向量/混合检索」。 

存储形态:纯 Markdown 文件 事实来源:模型「记得」的内容 = 写入磁盘的 Markdown;不依赖模型内部状态。默认布局(在 workspace 下,如 ~/clawd):memory/YYYY-MM-DD.md:按日期的日志,仅追加;会话开始时读「今天 + 昨天」。MEMORY.md(可选):长期、人工可维护的记忆;只在 main 私聊 session 加载,群聊不加载。 也就是说:短期、按天的记录 → memory/YYYY-MM-DD.md长期、精选事实 → MEMORY.md持久化完全靠「写进这些文件」,而不是靠对话历史本身。 

写入时机与「记忆冲刷」(Memory Flush) 平时:模型通过 工具(如 write、edit)或技能,把要记住的内容写到 MEMORY.md 或 memory/YYYY-MM-DD.md。自动冲刷:当 session 快触发自动 compaction 前,Moltbot 会跑一轮 静默的 agent 回合,专门提醒模型「把该持久化的东西写进记忆文件」,并鼓励用 NO_REPLY 不回复用户,避免用户看到这次内部回合。触发条件由 agents.defaults.compaction.memoryFlush 控制,例如在「剩余 token ≈ softThresholdTokens」时触发;每轮 compaction 只做一次 flush,并在 sessions.json 里记 memoryFlushCompactionCount 等,避免重复。 

相关代码在 src/auto-reply/reply/memory-flush.ts:shouldRunMemoryFlush():根据当前 token、context 上限、reserve、softThreshold 判断是否该 flush。

若 workspace 只读(如 sandbox workspaceAccess: "ro"),则不做 flush。 

检索层:向量 + 可选 BM25 混合检索 
数据流

实现方式 

插件控制:默认使用 memory-core 插件(可设 plugins.slots.memory = "none" 关掉)。工具:memory_search:对 MEMORY.md 和 memory/.md 做语义检索(按 ~400 token 分块、80 token 重叠),返回片段 + 文件路径 + 行号;可选开启 BM25 + 向量 的混合检索。memory_get:按路径(及可选 from/lines)读取 MEMORY 或 memory 下的文件片段,供在检索后精确拉取,控制上下文长度。向量索引:对MEMORY.md 和 memory/.md 建索引;索引按 agent 存于 ~/.clawdbot/memory/.sqlite(路径可配)。支持远程 embedding(OpenAI、Gemini 等)或本地模型(如 GGUF);可选 sqlite-vec 做向量加速。文件变更有 watcher(debounce),索引异步更新;若 embedding 模型/端点等变化,会整库重建索引。 

混搜权重分配

最终分数的计算公式非常简单(src/memory/hybrid.ts):

这意味着:向量搜索和文本三七开:最终得分 = 0.7×向量分 + 0.3×文本分(归一化后),偏重语义。候选池放大 4 倍:先取 maxResults × 4 的候选再合并、排序、截到 maxResults,提高最终 Top‑N 质量。 

Moltbot + powermem 方案


有 PowerMem VS 没有 PowerMem

集成 powermem 方案集成方式:已插件的方式进行集成

集成方式:新增插件 extensions/memory-powermem,通过 HTTP 调用 PowerMem 已启动的 API 服务;不把 PowerMem 作为库嵌入 Moltbot 进程。部署:用户需单独启动 PowerMem(如 powermem-server --host 0.0.0.0 --port 8000 或 Docker),并在 Moltbot 配置中填写 baseUrl(及可选 apiKey)。 代码结构代码地址:https://github.com/ob-labs/moltbot-extension-powermem

在 Moltbot Agent 里会暴露这些能力:memory_recall — 按查询搜索长期记忆memory_store — 写入一条记忆(可选是否智能抽取)memory_forget — 按记忆 ID 或按搜索条件删除 使用 powermem 插件 Step1: 前置条件 已安装 Moltbot(CLI + gateway 能正常用)PowerMem 服务:需要单独安装并启动(见下文两种方式,任选其一)若用 PowerMem 的「智能抽取」:需在 PowerMem 的 .env 里配置好 LLM + Embedding 的 API Key(如通义千问 / OpenAI) Step2:把本插件装进 Moltbot 在你本机执行(路径改成你实际克隆的目录):

安装成功后,可用 moltbot plugins list 确认能看到 memory-powermem。 Step3:配置 Moltbot 使用本插件 编辑 Moltbot 的配置文件(常见位置:~/.clawdbot/config.json 或项目里的 moltbot.json),在 根级 增加或合并 plugins 段,并把记忆槽指向本插件,并写上 PowerMem 的地址。 示例(JSON):

说明:baseUrl:PowerMem 的 HTTP 地址,不要加 /api/v1,就写 http://localhost:8000 或你的实际主机/端口。若 PowerMem 开了 API Key 鉴权,在 config 里增加 "apiKey": "你的key"。改完配置后重启 Moltbot gateway(或重启 Mac 菜单栏应用),配置才会生效。 Step4:验证插件与 PowerMem 连通 在终端执行:

若输出里没有报错、能看到健康状态,说明插件已连上 PowerMem。 Step5: 测试手动写入 + 搜索 我们来简单测试一下,用手动写入验证数据库是否有数据

 若搜索能返回刚写的那条(或类似内容),说明「安装 PowerMem → 安装插件 → 配置 Moltbot」全流程已打通。 下面是执行结果:

看一眼数据库,妥妥的已经写入了

 欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/  

typora-setup-x64是 Typora​ 的 64 位 Windows 安装包,Typora 是个所见即所得的 Markdown 编辑器,写笔记、博客、技术文档都很顺手,一边写一边就能看到最终效果,比传统双栏编辑器舒服很多。

安装很简单,下面一步步说。

一、准备工作

安装包下载:https://pan.quark.cn/s/9caec01429bb

二、安装步骤

  1. 双击 typora-setup-x64.exe运行。
  2. 如果是 Windows 10/11,会弹出“用户账户控制”提示 → 点  “是” (需要管理员权限)。
  3. 进入安装向导,选语言(一般默认中文或英文)→ 点  “下一步”
  4. 选“我接受协议”→ 点  “下一步”
  5. 选安装位置:

    • 默认是 C:\Program Files\Typora,想改就点“浏览”选 D 盘或其他盘,点  “下一步”
  6. 选附加任务:

    • 建议勾“创建桌面快捷方式”和“添加到开始菜单”,方便以后打开,点  “下一步”
  7. 点  “安装” ​ 开始安装,等进度条走完(大概十几秒到半分钟)。
  8. 最后点  “完成” ,安装结束,桌面会有 Typora 图标。

三、首次运行设置

  1. 双击桌面图标打开 Typora。
  2. 第一次打开会提示选择主题(有浅色、深色等),选一个看着舒服的。
  3. 进入主界面,左侧是文件列表,中间是编辑区,右边实时预览效果。

四、基本使用(简单说两句)

  • 新建文档:点“文件”→“新建”或 Ctrl+N
  • 写 Markdown:直接打字,用 #标标题、*斜体、**粗体、-列表等符号,右侧实时显示效果。
  • 插入图片:直接拖图片到编辑区,或 Ctrl+Shift+I选本地图片。
  • 导出文件:点“文件”→“导出”,可选 PDF、HTML、Word 等格式。
  • 保存Ctrl+S保存成 .md文件。

点赞 + 关注 + 收藏 = 学会了

整理了一个NAS小专栏,有兴趣的工友可以关注一下 👉 《NAS邪修》

Haptic 是一款开源极简的 Markdown 编辑器区别于传统编辑器的 “编辑 / 预览分屏” 模式,它能实时渲染 Markdown 语法(输入即显示最终效果,无割裂感),界面极简无多余干扰,还支持丰富格式,操作流畅如普通文本编辑,比同类工具更贴近 “自然书写” 的体验。

我很喜欢 Typora 这种”所见即所得“的编辑器,Typora 收费后我一直找同类产品。对于我来说在编辑体验方面 Haptic 是能取代 Typora 的。

这次我用群晖的 NAS 部署 Haptic,其他品牌的 NAS 部署流程差不多。

在”File Station“的”docker“文件夹下创建一个”haptic“文件夹。

打开”Container Manager“,新增一个「项目」。

填入以下信息。

输入以下代码,然后点击“下一步”。

services:
  haptic:
    image: chroxify/haptic-web:latest
    container_name: haptic
    ports:
      - 3002:80

「网页门户设置」这里要开启“通过 Web Station 设置网页门户”。

完成上述操作后,打开”Web Station“(没有的话就去「套件中心」下载),新增一个”网络门户“。填入以下信息。

注意,端口要设置一个和其他项目不冲突的数字,比如我这里设置的是 2388

完成上面的操作后,等待 Haptic 镜像下载成功后,打开浏览器输入 你NAS的IP + haptic端口 就能使用 Haptic 了。

比如我的是 http://192.168.31.85:2388


以上就是本文的全部内容啦,有疑问可以在评论区讨论~

想了解更多NAS玩法可以关注《NAS邪修》👏

点赞 + 关注 + 收藏 = 学会了

历时 10 个月,我开发了个记录 APP

大家好,在断断续续开发了 10 个月后,我想给大家重新介绍一下这款 APP 。(以下内容有小部分由 AI 写成)

开发背景

简单说一说开发这款工具的背景,之前那篇文章也说过:在 AI 记录应用满天飞的时代,我却反其道而行,做了个纯粹的记录应用 - 少数派 ,这里再简单说说:

在 2025 年 3 、4 月份:那段时间我非常厌倦写代码,每天上班都在想“要不要离职”,感觉非常痛苦,当时想着如果离职想法超过 20 次,就提离职,所以我需要一个记录离职想法的地方,用于量化我的内心想法——想记下每次的心情、原因,还要标注“想离职的强度”,偶尔不爽时还想录段语音吐槽。

我翻遍了 App Store ,却没找到一款能满足这种「量化想法 + 情感记录」的工具:要么功能太复杂,要么数据存在第三方服务器不放心,要么就是满屏广告。既然找不到,那就自己开发吧!

没想到 App 还没做完,我就提了离职了,不过最后也没离职,因为我厌倦的是写代码,所以内部转岗了,后续又出差了大半年,就是在出差过程中,这个“记录想法”的需求却越来越清晰:它不仅能记“离职倒计时”这种有目标的念头,还能记录生活里的闪念、灵感、吐槽,甚至是不想发朋友圈、微博的“私密碎碎念”——毕竟那些平台有审查风险,谁也不想哪天自己的记录突然消失。

好了,这大概就是「加一 - 想法量化与决策助手」的由来。

‎加一 - 想法量化与决策助手 App - App Store

有想法就记录

有想法,然后针对这个想法去记录。这是我日常的记录。

实际上我已经记录了 500 多条了,是该应用的疯狂使用者,每天都记录很多内容,也正是因为自己大量使用,所以才发现 APP 一个又一个问题,以及贴近使用者的最真实的需求。

添加想法、添加记录就是这么简单。

内置两种想法模式,一种是带有目标的,一种是备忘录模式

想法和记录都有不同的视图,自由切换随你自己。

Local First ,把数据主动权握在自己手里

用任何工具之前,我先会想到的是这个 APP 把用户的数据存放在哪里?会不会后续不再维护了,那我的数据怎么办?再者如果会存放一些私密数据的,还会考虑数据是否会泄露出去。

因为这些原因,我开发的 APP 最主要的目标是,Local First 。

特性 理想 Local First 工具标准 「加一」实测体验
数据存储 本地为主,云端仅作同步/备份 ✔ 主数据存在本地,iCloud 同步(后续将支持 WebDAV ),云端只存备份副本
离线工作 断网不影响核心功能 ✔ 地铁、电梯、飞机里照样随手记,完全不受网络限制
响应速度 无延迟,即时反馈 ✔ 打开 App 、写记录、搜内容都是秒开,比依赖云端的工具快太多
数据所有权 可自由导出、迁移 ✔ 支持 Html 、PDF 、JSON 、markdown 等多种格式导出,导出能够本地打开,还能完整导入回「加一」
隐私安全 敏感数据不泄露 ✔ 除了主动开启 AI 分析时会上传到 Deepseek ,无任何后台偷传数据

所有数据支持多种数据格式导出(图片、音频、文字等等),同时支持将导出数据导入到 Obsidian 或者苹果备忘录、或者以时光回忆录模式导出为 PDF 文档。

导出后的数据,还支持完整恢复导入到加一应用中,同时支持 flomo 数据导入,方便数据迁移。

并且现在有 AI 大模型加持,很多人会将数据发给 AI 进行分析,所以也支持将所有数据(图文、音频等)全部导出。

你的数据,随时可以搬家,我们不搞围墙。

自定义主题 + 字体,原生也能有个性

除了本地优先原则,我个人对个性化也非常推崇,所以加一 APP 内置了多个开源和可商用的字体,个人非常喜欢霞鹜文楷的字体,感谢作者开源。

同时内置了诸多个性主题,我本人是一个锤子手机爱好者,所以还特别内置了锤子风格主题,我很喜欢。

生物解锁,守护隐私安全

有时候记录了一些事情不想让别人知道,所以还加了个锁,后续如果有必要的话,还可以针对每个想法进行加锁,允许用户设置密码等操作。

搜索和小组件

APP 里面有多种搜索方式,支持快速找到想要的内容。

同时还支持桌面小组件和锁屏小组件,一切都是为了快速记录。

AI ,让想法更有价值

如果你想让 AI 分析你的想法,那么设置一下自己的 API key 即可。所有数据直达 DeepSeek ,APP 不会获取你的一丁点信息。

统计分析:量化你的“起心动念”

数据多了就可以进行统计分析,很酷的,细节非常多,快来体验体验。

谁适合用「加一」?

  • 不放心数据存在第三方平台的「隐私敏感型用户」;
  • 喜欢随手记闪念、吐槽、灵感,不想被 AI 打扰的「纯粹记录党」;
  • 需要量化想法、分析趋势的「决策纠结症患者」;
  • 用过 Obsidian 、Craft 但觉得“移动端不好用”“太复杂”的「工具党」;
  • 想找一个“无广告、无冗余功能”的「轻量化记录工具」。

欢迎体验,几乎所有国家都可体验,有任何问题可以在 APP 内提交反馈。 ‎加一 - 想法量化与决策助手 App - App Store

最后说句心里话

最后,我想说一些我个人的一点小看法:

Ai 时代,一些知识获取的成本极大降低,很多时候都不需要特意去记录,比如大段的代码,大批量的数据,很多技巧之类的,因为你随时可以问到,不用求教于其他人,成本极低且准确度很高。

所以我觉得这个时代,仅从我自身来说,我已经很少做笔记了,之前还收藏有用的代码,一些配置,现在 Obsidian 我就用于写长文,或者会议纪要,年终汇报,以及日常遇到复杂问题的解决方案。

这时代来临,我觉得反而内心的一些小触动,小想法,起心动念是容易被自己忽略掉的,这也是这个时代属于自己弥足珍贵的资产,因为你不是 ai ,你的想法是原汁原味的,是最纯粹的。AI 变化再快,你还是你,你还是有自己一地鸡毛的生活,或是在当牛做马或者逍遥快活。

AI 时代,留住你的本真。👉 App Store 传送门 ‎加一 - 想法量化与决策助手 App - App Store

背景

在维护 奥升官网(基于 Nuxt 3 构建)的过程中,我们需要将发布在其他平台的技术文章迁移到官网的内容管理系统中。手动复制粘贴不仅效率低下,还容易遗漏图片资源或导致格式错乱。

借助 Trae IDEChrome MCP,我们可以将这一过程高度自动化。本文将详细介绍这套抓取方案的思路与实现。

环境与工具

本方案依赖以下核心环境与工具:

  1. Trae IDE:新一代 AI 驱动的集成开发环境(我使用的国际版,开了会员),可调用 Gemini-3-Pro-Preview 模型,支持复杂的上下文理解与多步任务执行。
  2. MCPmcp_chrome,提供浏览器自动化能力,用于访问网页、读取 DOM 结构、截图等。

抓取思路

整个抓取流程可以概括为以下四个步骤:

  1. 目标分析: AI 通过 MCP 浏览器工具访问目标 URL,解析页面结构,识别标题、正文、发布时间及图片链接。
  2. 内容提取: 将 HTML 内容转换为符合 Nuxt Content 规范的 Markdown 格式,并自动提取 Frontmatter(元数据)。
  3. 图片处理:

    • 自动下载文章中的图片到 public/images/articles 目录,并按文章id分文件夹存储。
    • 使用 sharp 对图片进行压缩优化(WebP/JPG 转换、尺寸调整)。
    • 将图片按上传到 OSS 指定文件路径中。
    • 替换 Markdown 中的图片链接为 OSS 上的路径。
  4. 自动收录: 将处理好的 Markdown 文件写入 content/articles/ 目录。

关键实现

1. 页面内容读取

利用 MCP 的 chrome_read_pagechrome_get_web_content 工具,我们可以直接获取渲染后的页面内容,这对于动态加载的页面尤为重要。

2. 图片资源的自动化处理

1. 提取链接
AI 会从 DOM 中找出所有 <img> 标签的 src 属性。

2. 批量下载
AI 会生成并执行 Shell 命令(如 curlwget)来下载图片。

# AI 自动生成的下载命令示例
mkdir -p publichttps://ucode-orise.oss-cn-beijing.aliyuncs.com/website/article/20
curl -o publichttps://ucode-orise.oss-cn-beijing.aliyuncs.com/website/article/20/1.jpg http://example.com/path/to/image.jpg

3. 图片压缩
利用项目中的 sharp 脚本对下载的图片进行批量处理,确保加载性能。

4. 图片上传到 OSS
使用ali-oss 库,编写 upload_oss 脚本,将压缩后的图片上传到 OSS 上指定的目录。

async function uploadFile(filePath, retryCount = 0) {
    // 处理上传到oss的文件路径
    const relativePath = path.relative(articlesDir, filePath);
    const objectName = `website/article/${relativePath.split(path.sep).join('/')}`;

    try {
        const result = await client.put(objectName, filePath);
        //... 
    } catch (err) {
        //...
    }
}

3. Markdown 生成与 Frontmatter 注入

Nuxt Content 要求每篇文章包含特定的元数据。我们定义了统一的 Prompt 模板,让 AI 生成标准格式:

---
title: 文章标题
slug: article-slug
description: 文章摘要...
date: 2024-03-20
category: 分类
cover: https://ucode-orise.oss-cn-beijing.aliyuncs.com/website/article/[slug]/cover.jpg
---

## 正文内容
...

实际效果展示

下图是我们在 Trae 环境中开发时的文章列表页面截图,展示了收录后的效果:

IDE
IDE
IDE

总结

通过 Trae IDE + MCP 的组合,我们将原本需要 10 分钟/篇的人工迁移工作缩短到了 2-3 分钟/篇(主要是AI对话推理时间)。开发者只需提供一个 URL,剩下的分析、下载、转换、优化工作全部由 AI 代理完成。这不仅极大提升了效率,还保证了代码风格与目录结构的一致性。

作为一个十多年的程序员,笔记似乎始终没有离开我的身边,先回顾一下我的整个笔记使用的历史,下面都是我深度使用,大部分都是付费使用过的笔记 app ,当然几乎全是 macOS 上的。它也深刻地体现了时代发展留下的烙印(好中登的语句....

  1. 印象笔记
  2. 印象笔记 + Markdown (马克飞象)
  3. Mou (纯本地 Markdown App)
  4. MWeb Typora 等等雨后春笋般的 Markdown 工具
  5. Notion
  6. Apple Notes
  7. Craft
    ...

直到现在,就直接用手机系统自带的笔记,基本不怎么用额外的笔记软件。

为什么不用了?因为发现记的笔记大部分根本没什么用。以前记笔记是把很多的经验性的内容记录下来,方便以后查询,节省后面的时间,有很长的长尾效应和长尾收益。

但在 AI 时代,大模型压缩了所有互联网上的知识,我们所有的笔记也基本上都在里面。(当然,这里边包含的不包括我们自己创造的东西。比如写的文章、小说、短文和诗歌。)

去查笔记,远不如直接问 AI 更便捷,更全面,甚至更与时俱进。

更有时效性的我会直接语音让 vivo 的小 v 记忆帮我记录下来,然后后面使用的时候,我直接语音问询小 v 即可。比如我想记录一下我家的门锁换一次电池可以用多长时间,在我第一次给它安装电池的时候,就语音告诉小 v 今天我给门锁安装了电池。当下次门锁提醒我没电需要换电池的时候,我就直接语音问小 v ,距离上次给门锁换电池过去了多久即可。

顺应时代潮流,享受它们的乐趣。

你觉得呢?

一个程序员2004年的决定,如何悄悄改变了整个互联网?

想象一下:

你正在写一份工作报告,想给标题加个粗体,或者插入一个网址链接。

在传统的 Word 文档里,你需要花几分钟时间找各种按钮、菜单,偶尔还会因为误操作把整页格式搞乱。

现在,你只需要输入 # 标题 就能得到大标题,输入 **粗体文字** 就能得到粗体,输入 [点击这里](网址) 就能得到一个可点击的链接。

简单、直接、高效,就像发微信一样自然。

这就是 Markdown。

本篇和你讲讲 Markdown 背后的故事,以及为什么它能成功到风靡全球,以及它的故事对我们的启示。

1. 一个决定

故事要从 2004 年说起。

那时的互联网还很“原始"”,如果想在网页上发布一篇文章,你必须学习一门叫 HTML 的语言。

想象一下,每次写文章都要像这样编码:

<h1>我的文章标题</h1><p>这是一段<strong>重要</strong>的文字,包含一个<a href="链接地址">链接</a>。</p>

这就像是想给朋友写封信,却必须先学会用摩斯密码一样荒谬。

就在这时,一个叫约翰·格鲁伯的程序员做了一个大胆的决定:创造一种“反HTML”的格式。

HTML是“标记语言”,那他就创造一种“反标记语言”——Markdown。

约翰的想法很简单:为什么不能让写文章就像写普通邮件一样简单?

1.png

2. 意外传播

约翰发布 Markdown 时,并没有想到它会成为互联网的基础设施。

他只是厌倦了复杂的 HTML 语法,想为自己和朋友提供一个更简单的选择。

但接下来发生的事情连约翰自己都没想到:

  • 2004 年:Markdown 悄悄诞生
  • 2005-2010 年:程序员们开始用 Markdown 写技术文档
  • 2010-2015 年:各大平台开始支持 Markdown 格式
  • 2015-2020 年:笔记软件、协作工具全面拥抱 Markdown
  • 2020 年至今:连苹果的 Notes 都支持 Markdown 了

这就像你发明了一种新的记账方法,结果全世界的企业都跟着用了。

2.png

3. Markdown 成功的十个原因

所以为什么 Markdown 能在众多技术中脱颖而出呢?

让我们看看它的成功秘密:

1. 绝妙的名字

“Markdown”这个名字很好!懂技术的人一眼就知道它是“反 Markup”,普通人听起来也简单好记。

2. 解决了真实痛点

不是所有新技术都解决了实际问题,但 Markdown 确实让无数人从 HTML 的折磨中解脱了出来。

3. 顺应了用户习惯

Markdown 的语法基于人们已经在邮件和文档中形成的习惯。比如用 * 表示强调,用 # 表示标题等。

4. 找到了最佳时机

2004 年正值博客爆发期,人们正在寻找更好的写作工具。Markdown 正好撞上了这个风口。

5. 开放包容的社区

从一开始,Markdown 就有一个开放的社区。

各种版本出现:GitHub 版本、通用版本、扩展版本...但核心依然保持一致。

6. 极简主义的设计哲学

保持简单,而不是追求复杂。这是很多成功技术的共同特点。

7. 技术人员的推动

程序员们是早期使用者,他们发现了 Markdown 的价值并大力推广,形成了滚雪球效应。

8. 可读性强

即使不懂 Markdown 语法的人,看到 .md 文件也能大概猜出意思。这种“自我解释”的能力很珍贵。

9. 跨平台兼容

Markdown 文件在任何设备、任何系统上都能正常显示和编辑。不怕软件更新,不怕系统迁移。

10. 零专利壁垒

最重要的是,约翰·格鲁伯没有为 Markdown 申请专利。这意味着任何人都可以自由使用它。

3.png

4. 带给我们什么启发?

Markdown 的故事不仅仅是一个技术成功的案例,它还给我们很多启发:

4.1. 简单比复杂更有力量

在这个喜欢把简单事情搞复杂的世界里,Markdown 证明了“less is more”的智慧。

4.2. 从解决实际问题出发

不是为了技术而技术,而是为了解决人们的实际问题。Markdown 的成功源于它真的让写作变得更简单。

4.3. 长期主义的重要性

从 2004 年到今天,Markdown 已经存在了20年。它没有一夜爆红,而是慢慢渗透,最终无处不在。

4.png

5. 最后

不是每个人都需要发明影响世界的技术,但每个人都可以创造一些让世界变得更美好的小东西。

关键在于:观察人们真正的问题,提出简单的解决方案,然后分享给世界。

或许这就是 Markdown 的故事给我们的最珍贵的礼物。

我是冴羽,10 年笔耕不辍,专注前端领域,更新了 10+ 系列、300+ 篇原创技术文章,翻译过 Svelte、Solid.js、TypeScript 文档,著有小册《Next.js 开发指南》、《Svelte 开发指南》、《Astro 实战指南》。

欢迎围观我的“网页版朋友圈”,关注我的公众号:冴羽(或搜索 yayujs),每天分享前端知识、AI 干货。

VSCode 中预览 Markdown(.md) 文件的完整指南

VSCode 内置了 Markdown 预览功能,可以实时查看 Markdown 文件的渲染效果。当你编写文档、README 文件或技术笔记时,预览功能能帮你确认格式是否正确。

使用内置预览功能

VSCode 自带 Markdown 预览,无需安装额外插件。

打开预览窗口

在编辑 Markdown 文件时,按 Ctrl+Shift+V(Windows/Linux)或 Cmd+Shift+V(Mac)即可打开预览窗口。预览窗口会在新标签页中显示渲染后的内容。
alt text

并排预览

如果希望边编辑边预览,按 Ctrl+K V(Windows/Linux)或 Cmd+K V(Mac),先按 Cmd+K,松开后再按 V。这会在编辑器右侧打开预览面板,左侧编辑文件,右侧实时显示预览效果。
alt text
alt text

通过命令面板操作

Ctrl+Shift+P(Windows/Linux)或 Cmd+Shift+P(Mac)打开命令面板,输入 "Markdown",可以看到相关命令:

  • Markdown: Open Preview - 打开预览
  • Markdown: Open Preview to the Side - 并排预览
  • Markdown: Open Source - 从预览返回源文件

通过右键菜单

在 Markdown 文件的编辑器标签上右键,选择 Open PreviewOpen Preview to the Side

alt text

使用插件增强预览功能

虽然内置预览功能已经很实用,但插件可以提供更多特性和更好的体验。

安装 Markdown Preview Enhanced 插件

这是最受欢迎的 Markdown 预览插件之一。

安装方法

  1. Ctrl+Shift+X(Windows/Linux)或 Cmd+Shift+X(Mac)打开扩展面板
  2. 在搜索框中输入 "Markdown Preview Enhanced"
  3. 找到由 Yiyi Wang 开发的插件,点击 "Install"

alt text

使用插件预览

安装后,在 Markdown 文件中右键,选择 Markdown Preview Enhanced: Open Preview to the Side,或按 Ctrl+K V
alt text

插件特色功能

  • 支持数学公式(LaTeX)
  • 支持流程图和时序图(mermaid、PlantUML)
  • 支持目录生成
  • 支持导出为 PDF、HTML、PNG 等格式
  • 支持幻灯片模式
  • 更丰富的主题样式
    alt text
    alt text

其他推荐插件

Markdown All in One:

提供快捷键、自动补全、格式化等功能,包含预览功能和目录生成。

安装方法

  1. 打开扩展面板
  2. 搜索 "Markdown All in One"
  3. 安装 Yu Zhang 开发的插件
markdownlint:
  • 检查 Markdown 语法错误
  • 提供格式规范建议
  • 帮助保持文档质量

图片云上传 IMG-CLOUD-UPDATE

项目介绍

在写博客的场景下,不可避免上传一些图片。作为博客文章插图。

我都是直接上传到我阿里云的 oss 里面。但是阿里云自带的工具太重了,每次打开等半天,而且复制 url 还得点好几下。

我花了一周做了一个快速上传图片到阿里云 OSS ,并且直接生成 makedown 格式的图片链接,方便你写博客或文章的时候快速上传并插入。

下面是正经的介绍:


图片云上传是一款前端使用 vue3+element-plus ,后端使用 go+gin+bbolt 的图片上传项目。使用该项目可以让你更快的把本地图片传到远程图片云仓库。当前版本支持阿里云 oss 。不用担心你的 access_key_id 会泄露,本系统保存到本地二进制数据库,不做任何远程传输。

本项目也适合初学者学习参考,内有大量的注释,对于学习 golang 和 VUE 都有比较大的帮助。

已支持:

  • 阿里云 oss
  • 自定义路径
  • 自定义/自动修改名称
  • 自动添加 markdown 格式
  • 支持设置密码/默认安装页面

未支持

  • 显示多层文件列表
  • aws/腾讯云/七牛等更多远程仓库

截图


https://imgur.com/1kA2Bav

https://imgur.com/gIbloDS

依赖组件:

1. 前端:

  1. vue3
  2. element-plus
  3. pinia
  4. axios
  5. vue-router

2. 后端:

  1. go
  2. gin
  3. bbolt

安装

  1. docker 编译安装

直接执行 make 即可,会先编译 web 端,再编译 server 端。再打包容器镜像。最后 docker 运行镜像。

参考项目:

最近无论是看论文还是折腾知识库,喂给大模型的时候使用 pdf 或者链接的方式体验非常不爽。
还有就是下载 2312.12345.pdf 这种无意义的文件名非常反人类,于是开发了这个转 markdown 插件。

两种转 markdown 方式,在 setting 页面进行设置:

  1. 基于 ar5iv 的 HTML 转 markdown
    • 转换速度快
    • 最新的论文可能没有 ar5iv 页面
  2. 使用 minerU 的 api 进行转换
    • 转换速度慢
    • 最新论文也支持

直接安装:

项目地址:

觉得有用可以点个 star


📌 转载信息
原作者:
SimonSun
转载时间:
2026/1/19 18:23:29

最近折腾 Memos,用 claude code 和 codex 搓了一个小玩具,实现开源卡片笔记 Memos 的每日回顾,参考了 flomo。

主要功能:

  • 卡片式翻阅:像抽卡一样回顾笔记,随时切换 “换一批。
  • Markdown - 支持标题、列表(含嵌套)、行内格式
  • 图片弹窗预览 - 多图预览和左右切换
  • 编辑同步 - 支持回顾中编辑当前 Memo 并保存到服务器

使用

复制脚本内容并粘贴到 设置-系统-自定义脚本,保存即可,右下角会出现 “每日回顾” 按钮。

说明

感谢站内各位大佬的公益站。我本人完全不懂代码,纯粹为了好玩,有什么改进或问题可能要麻烦大佬们亲自动手了,老弟水平有限 。
下一步研究一下 blinko,感觉也很有意思。


📌 转载信息
原作者:
04ffff
转载时间:
2026/1/18 15:50:04

OpenAI 的网页版一直存在一个 bug,当点击复制按钮时,复制出的公式内容会进行错误的转义。

正确的 Markdown 格式ChatGPT 复制出来的结果
\[ f(x) = \frac{1}{x} \][ f(x) = \frac{1}{x} ]
\( a = \frac{3}{5} \)( a = \frac{3}{5} )

然后,我就借助 Antigravity 自带的浏览器控制功能,对这个 bug 进行了逆向分析

分析结果是:

  1. ChatGPT 页面中,Message 对象存储的原始 Markdown 是完整的,形如 "\\( a=\\frac{3}{5} \\)"
  2. 在点击复制时,触发一个名为 copyToClipboard 的函数
  3. 该函数会调用一个 stripEscapes() 函数,手动进行 转义符清洗,例如把 \# 变成 #
  4. 错误就出在这里,它也会错误地将 \[ 变成 [,导致复制出的 LaTeX 出问题

找到了错误,修正就很简单,这里直接搜索 React 组件的原始数据,找到 markdown 后直接复制即可。

我也是让 Antigravity Opus 写了个油猴脚本,先将原始的复制事件拦截,然后替换成正常的,效果很好。如果有更多需求,佬友们可以自行二次开发。

// ==UserScript== // @name         ChatGPT LaTeX 复制修复 // @namespace    https://github.com/theigrams // @version      1.0.0 // @description  直接从 React 状态读取原始 Markdown,绕过 ChatGPT 的错误转义逻辑 // @author       Antigravity // @match        https://chatgpt.com/* // @match        https://chat.openai.com/* // @icon         https://chat.openai.com/favicon.ico // @grant        none // @run-at       document-end // ==/UserScript==

(function () { "use strict";

  /**
* 从 React Fiber 中提取原始 Markdown
* @param {HTMLElement} turnElement - conversation-turn 元素
* @returns {string} 原始 Markdown 文本
* @throws {Error} 如果无法读取 React 状态
*/
function getOriginalMarkdownFromReact(turnElement) { // 获取 React Fiber 节点 const fiberKey = Object.keys(turnElement).find((k) => k.startsWith("__reactFiber$") ); if (!fiberKey) { throw new Error("无法找到 React Fiber 节点"); } let fiber = turnElement[fiberKey]; let depth = 0; const maxDepth = 50; // 向上遍历 Fiber 树,查找消息数据 while (fiber && depth < maxDepth) { const props = fiber.memoizedProps; if (props) { // 尝试多种可能的数据路径 // 路径 1: message.content.parts if (props.message?.content?.parts) { const parts = props.message.content.parts; if (Array.isArray(parts) && parts.length > 0) { console.log("[Markdown Copy] 找到数据路径: message.content.parts"); return parts.join("\n"); } } // 路径 2: displayParts if (props.displayParts) { const parts = props.displayParts; if (Array.isArray(parts) && parts.length > 0) { // displayParts 可能是对象数组 const text = parts .map((p) => (typeof p === "string" ? p : p.text || "")) .join(""); if (text) { console.log("[Markdown Copy] 找到数据路径: displayParts"); return text; } } } // 路径 3: text 属性 if (typeof props.text === "string" && props.text.includes("\\")) { console.log("[Markdown Copy] 找到数据路径: text"); return props.text; } // 路径 4: content 字符串 if (typeof props.content === "string" && props.content.includes("\\")) { console.log("[Markdown Copy] 找到数据路径: content"); return props.content; } // 路径 5: children 中的文本 if (props.children?.props?.message?.content?.parts) { const parts = props.children.props.message.content.parts; if (Array.isArray(parts) && parts.length > 0) { console.log( "[Markdown Copy] 找到数据路径: children.props.message.content.parts" ); return parts.join("\n"); } } } fiber = fiber.return; depth++; } throw new Error(`遍历了 ${depth} 层 Fiber 节点,未找到原始 Markdown 数据`); } /**
* 深度搜索 React 状态中的 Markdown 内容
* @param {HTMLElement} turnElement
* @returns {string}
*/
function deepSearchMarkdown(turnElement) { const fiberKey = Object.keys(turnElement).find((k) => k.startsWith("__reactFiber$") ); if (!fiberKey) { throw new Error("无法找到 React Fiber 节点"); } const visited = new Set(); let result = null; function search(obj, path = "", depth = 0) { if (depth > 20 || !obj || visited.has(obj)) return; if (typeof obj !== "object") return; visited.add(obj); // 检查是否是我们要找的数据 if (Array.isArray(obj) && obj.length > 0 && typeof obj[0] === "string") { const text = obj.join("\n"); // 检查是否包含 LaTeX 定界符(正确的格式) if ( text.includes("\\[") || text.includes("\\(") || text.includes("\\begin") ) { console.log(`[Markdown Copy] 深度搜索找到数据: ${path}`); result = text; return; } } if (typeof obj === "string" && obj.length > 50) { if ( obj.includes("\\[") || obj.includes("\\(") || obj.includes("\\begin") ) { console.log(`[Markdown Copy] 深度搜索找到字符串: ${path}`); result = obj; return; } } for (const key in obj) { if (result) return; // 已找到,停止搜索 try { search(obj[key], `${path}.${key}`, depth + 1); } catch (e) { // 忽略循环引用等错误 } } } let fiber = turnElement[fiberKey]; let fiberDepth = 0; while (fiber && fiberDepth < 30 && !result) { if (fiber.memoizedProps) { search(fiber.memoizedProps, `fiber[${fiberDepth}].memoizedProps`); } if (fiber.memoizedState && !result) { search(fiber.memoizedState, `fiber[${fiberDepth}].memoizedState`); } fiber = fiber.return; fiberDepth++; } if (!result) { throw new Error("深度搜索未找到包含 LaTeX 定界符的原始 Markdown"); } return result; } /**
* 显示提示消息
*/
function showToast(message, isError = false) { const toast = document.createElement("div"); toast.textContent = message; toast.style.cssText = ` position: fixed; bottom: 20px; right: 20px; background: ${ isError ? "linear-gradient(135deg, #ef4444 0%, #dc2626 100%)" : "linear-gradient(135deg, #10a37f 0%, #1a7f64 100%)" }; color: white; padding: 12px 20px; border-radius: 8px; font-size: 14px; font-weight: 500; z-index: 10000; box-shadow: 0 4px 12px ${ isError ? "rgba(239, 68, 68, 0.3)" : "rgba(16, 163, 127, 0.3)" }; animation: slideIn 0.3s ease; `; const style = document.createElement("style"); style.textContent = ` @keyframes slideIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } `; document.head.appendChild(style); document.body.appendChild(toast); setTimeout(() => { toast.style.opacity = "0"; toast.style.transform = "translateY(10px)"; toast.style.transition = "all 0.3s ease"; setTimeout(() => toast.remove(), 300); }, 3000); } /**
* 拦截复制按钮点击
*/
function interceptCopyButtons() { document.addEventListener( "click", async (e) => { // 检查是否点击了复制按钮 const btn = e.target.closest( 'button[data-testid="copy-turn-action-button"]' ); if (!btn) return; // 阻止原始的复制行为 e.stopPropagation(); e.preventDefault(); console.log("[Markdown Copy] 拦截到复制按钮点击"); try { // 找到对应的消息容器 const turn = btn.closest('[data-testid^="conversation-turn-"]'); if (!turn) { throw new Error("无法找到消息容器元素 (conversation-turn)"); } console.log( "[Markdown Copy] 找到消息容器:", turn.getAttribute("data-testid") ); // 尝试从 React 状态读取原始 Markdown let markdown; try { markdown = getOriginalMarkdownFromReact(turn); } catch (e1) { console.log("[Markdown Copy] 常规路径失败,尝试深度搜索..."); markdown = deepSearchMarkdown(turn); } if (!markdown) { throw new Error("获取到的 Markdown 为空"); } // 写入剪贴板 await navigator.clipboard.writeText(markdown); console.log("[Markdown Copy] 成功复制原始 Markdown"); console.log( "[Markdown Copy] 预览:", markdown.substring(0, 200) + "..." ); showToast("✓ 已复制原始 Markdown"); } catch (error) { console.error("[Markdown Copy] 错误:", error); showToast(`✗ 复制失败: ${error.message}`, true); // 不 fallback,直接报错 throw error; } }, true ); // 使用捕获阶段,确保先于其他处理器执行 } // 初始化 console.log("[Markdown Copy] 脚本已加载 v1.0.0"); interceptCopyButtons(); console.log("[Markdown Copy] 复制按钮拦截已启用"); })();

📌 转载信息
原作者:
Theigrams
转载时间:
2026/1/14 17:40:35

前情提要:

https://www.v2ex.com/t/1184452


  • 如何让一个自建节点可以被当作类似 Jira / GitHub Issues 那样的项目管理工具来使用
  • 节点级别的图库(基于 IPFS CID )
  • 更方便的图片上传体验
  • 自建节点可以添加多位管理员 NodeCoAdmin
  • 定制背景图、定制配色
  • 更细颗粒的权限配置:是否允许节点内的内容被发帖者自由编辑甚至删除
  • 为节点添加外链列表
  • 为节点添加文档 / FAQ
  • 节点名称本身可以被拍卖或者接受别人的出价
  • 全新的全屏 Markdown 编辑体验
  • 基于节点的邀请链接机制
  • 节点之间的友情链接机制


这些想到的不一定会都全部马上做,但我至少先记录下来。

地址:https://wedown.app

  • 基于 Markdown 的在线编辑器
  • 实时预览
  • 一键复制
  • 支持自定义主题
  • 支持 Github 图床

基本功能都有了,我自己也用了近半个多月了。

后面想集成 AI 进来,打算将部分功能搞成订阅制,但是卡在了支付这一步。

本来想注册一个个体工商户的,结果反复申请了几次不给过,那边的人态度太屌了,多问一下就不耐烦最后直接说个人开发者不给注册。

我真的受够那帮人了,关于线上支付大家还有没有什么好的方案啊?真心求教一下个人开发者怎么才能走通这一步啊?

之前了解过 stripe ,但国内好像不太好申请,还有一些小众平台收费死贵还感觉不太靠谱。

在走通这一步之前,先放出来给大家免费试用吧

如果感兴趣,也欢迎大家贡献主题模板:

https://github.com/wedown/wedown-themes

这是一个开源项目,如果后期真的走通了这一步,主题也会完全免费使用的。

个人开发者真的太难了,望大神们指点一下

项目官网:

  1. 原生安卓,相比较 Flutter 等框架,性能很强。

  2. 笔记私有,任务也是根据笔记获取的,可以使用 Webdav 等同步,我也搞了官方同步,后续用于文章分享等。


  3. 【完善中】OCR 功能,我选择了 Paddle OCR 本地,AI 可用于后续生成待办和文章。

  4. 【正在做】语音功能,可能会使用 whisper。

  5. 【正在做】绘图功能,使用 ExcalidrawXournal++

项目:


📌 转载信息
原作者:
HansJack
转载时间:
2026/1/5 12:11:17

每次使用 kelivo 后想要复制黏贴出来的效果都不太理想,需要打开 snip 转格式太麻烦了,所以自己用 claude 大模型弄了一个油猴脚本。


可以改样式

期待各位佬友能够一起优化一下。
Markdown 转 Word 工具 - Linux.do 专用(高级版)-3.0.txt


📌 转载信息
原作者:
910417099
转载时间:
2026/1/4 18:26:25

gemini 最近复制有点问题:复制漏公式

弄个了 markdown 复制脚本:Gemini to Markdown Copier (Fix Empty Lines)

之前的 linux.do 的复制脚本也顺便分享一下:Linux.do Downloader (New Version)

内容:

  1. 支持预览
  2. 支持轮数选择
  3. 常见格式支持
  4. 空行优化

优化了几个版本了,还有问题的话让 gemini 再改一下就行了

效果:


📌 转载信息
原作者:
BigShark667
转载时间:
2026/1/2 12:30:09

Anki

Anki 是一款免费、开源的闪卡 (flash card) 程序。它运用了例如主动回忆测试和间隔重复的设计,帮助用户进行记忆。

优点

它优秀的点在于,所有卡面我们都可以用 css 自己设计,而且手机,电脑,ipad 之类的可以全端同步。所有卡的内容我们也可以自己制作 csv 文件来导入,拥有非常强大的客制化能力。

由来

这个软件通常的的使用场景为,零碎时间的背单词,或者记忆任何 “问题”,“回答” 的场景。

而,我自认为我的深度学习机器学习基础并不牢靠,很多基础概念甚至有时候都会有遗忘。传统意义上,可能最好的解决方法是去找一个哈佛斯坦福的深度学习公开课,然后啃下来。但实际上,学过公开课的人应该都知道,我们都没啥自控力,顶多看两三节就没然后了。或者是以输出倒逼输入,直接做相关项目,有不会的东西在学,做中学。我是觉得这样对以后的工程能力和整体理解能力都更有帮助,但是,也有一个问题,我没办法走到哪都能写代码,到哪都有一台电脑。我随身的只有手机。那,看深度学习的优秀教科书?《Deep Learning》《Understand Deep Learning》什么的?

我说实话,我试过看 C Primer Plus 或者托马斯微积分之类的大部头书籍,你真的在图书馆慢慢一点一点看还好说,就坐公交等公交那 10 分钟 15 分钟,真的很难有一点点知识吸收。大部分情况都是,努力理解英语本身,英语在脑子里翻译完成中文就到站了,每次看的都是那本书的 “序”。

能力

所以,我为了减轻认知负荷,给日常这种小的碎片时间能学习 DL 的可能,我去做了这么一个词组,我自己写的程序,让 Gemini3.0 pro 来一个章节一个章节的总结那两本经典教材,总结出启发式的问题和回答对。然后设计了整个 anki 的 UI,适配了电脑端,web 端,android 端,ios 端,设计了白天模式和黑夜模式。最终,现在能得到一个好看的,有内容的 “单词本”,我觉得挺有意义的,所以我发出来。

对了,我还让 Anki 的这个单词本支持了 Markdown 格式,也支持了 Latex 公式内嵌,所以,看起来应该还是挺赏心悦目的。

想要的可以找我,我看人多的话我就开源,人不多我就自己学着玩儿了。

展示

Anki:

卡牌示例:

windows:

Android:

[gaivrt (GAIVR) · GitHub]


📌 转载信息
原作者:
gaivrt
转载时间:
2026/1/1 15:25:23

老老贴编辑不了啦,只能开新贴啦。距离上次水贴可太久了,来续一下项目新的更新, 距离上次陆陆续续加了一点东西,用起来挺顺手的对于 Serverless 部署,算是压榨完了大善人。当然还是提醒一下 毕竟涉及到大批量上传下载功能,推荐自用即可

老帖地址:基于 Cloudflare 的在线文本 / 大文件分享平台,支持多种语法 Markdown 渲染、阅后即焚、R2~B2 等 S3 聚合存储、密码保护等功能,可作为 WebDav 挂载,支持 Docker 部署。

老老贴: 基于 Cloudflare Worker 部署的在线剪切板,支持 markdown 和文件分享(优化更新 10)

部署的教程也优化到最简了,基本动动手指运行一下 github action 就一键部署了,支持前后端分离,当然也可以单 worker 部署。

简单介绍下项目具体功能


多存储支持

  • S3 兼容:Cloudflare R2、Backblaze B2、AWS S3、阿里云 OSS、腾讯云 COS、MinIO 等
  • 网盘集成:WebDAV、OneDrive、Google Drive、Telegram、GitHub API/Releases(只读)等等
  • 本地存储:Docker 部署支持本地文件系统
  • 智能上传:前端预签名直传 + 流式上传 + 分片断点续传,进度实时显示,最大限度摆脱 cf 限制
  • 文件预览:支持 30 + 种格式直接预览(图片、视频、音频、PDF、Office、代码、电子书等),其余可通过外部 IFrame 嵌入 KKFileview 预览
  • 定时任务:支持定时清理上传会话、存储同步、搜索索引重建等自动化任务
  • 统一管理:可视化配置多存储,灵活切换默认存储源

Markdown 编辑器

  • Vditor 集成:支持 GitHub 风格 Markdown、数学公式、流程图、思维导图
  • 实时预览:所见即所得编辑体验
  • 多格式导出:PDF、HTML、PNG、Word 一键导出
  • 安全分享:密码保护、过期时间、访问次数限制
  • Raw 直链:类似 GitHub Raw,适合配置文件托管

WebDAV 协议支持

  • 标准协议:支持任意 WebDAV 客户端挂载为网络驱动器
  • 完整操作:目录创建、文件上传、删除、重命名、移动
  • 权限控制:API 密钥授权,细粒度访问控制
  • 缓存优化:可配置 TTL,减少上游请求

以及一些部分小功能…


Github: GitHub - ling-drag0n/CloudPaste: A Cloudflare-based online text/file sharing platform that supports multiple syntax Markdown rendering, self-destructing messages, S3/WebDav/OneDrive/GoogleDrive/TG/GithubAPI/Local aggregated storage, password protection, and more. It can be mounted as WebDAV and supports Docker deployment.
demo 地址 [游客令牌:guest]: CloudPaste - 安全分享您的内容
文档地址: https://doc.cloudpaste.qzz.io/

部分 demo 图展示:

水完咯收工
当然还是求求小小的 start 啦


📌 转载信息
原作者:
2512132839
转载时间:
2025/12/27 21:19:29