{"id":47696026,"url":"https://github.com/llm-x-factorer/md2red","last_synced_at":"2026-04-07T10:01:02.389Z","repository":{"id":347491904,"uuid":"1194194513","full_name":"LLM-X-Factorer/md2red","owner":"LLM-X-Factorer","description":"将 Markdown 文档自动转化为小红书图文轮播帖子并发布。Markdown to Xiaohongshu (RED) image-text note converter \u0026 publisher.","archived":false,"fork":false,"pushed_at":"2026-03-29T06:37:46.000Z","size":419,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-03T20:02:31.339Z","etag":null,"topics":["cli","markdown","playwright","react","typescript","xiaohongshu"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LLM-X-Factorer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-28T03:08:39.000Z","updated_at":"2026-03-29T06:37:50.000Z","dependencies_parsed_at":"2026-04-03T19:00:33.339Z","dependency_job_id":null,"html_url":"https://github.com/LLM-X-Factorer/md2red","commit_stats":null,"previous_names":["llm-x-factorer/md2red"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/LLM-X-Factorer/md2red","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LLM-X-Factorer%2Fmd2red","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LLM-X-Factorer%2Fmd2red/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LLM-X-Factorer%2Fmd2red/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LLM-X-Factorer%2Fmd2red/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LLM-X-Factorer","download_url":"https://codeload.github.com/LLM-X-Factorer/md2red/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LLM-X-Factorer%2Fmd2red/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31508282,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T03:10:19.677Z","status":"ssl_error","status_checked_at":"2026-04-07T03:10:13.982Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","markdown","playwright","react","typescript","xiaohongshu"],"created_at":"2026-04-02T16:26:09.738Z","updated_at":"2026-04-07T10:01:02.384Z","avatar_url":"https://github.com/LLM-X-Factorer.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# md2red\n\n将 Markdown 文档转化为小红书风格的图文轮播卡片。生成的图片可导出后手动发布。\n\n[English](./README_EN.md)\n\n## 功能特性\n\n- **Markdown 解析** — 按 H2 标题自动拆分内容块，提取代码块、图片引用和 frontmatter\n- **React SSR 图片卡片** — 封面、内容、代码、总结四种卡片模板，1080×1440 像素（3:4 比例）\n- **语法高亮** — Shiki 驱动的代码高亮，支持 Catppuccin 暗色/亮色主题\n- **Markdown 渲染** — 列表、加粗、斜体、行内代码通过 remark-rehype 管道渲染\n- **多 LLM 支持** — Gemini、OpenAI、Anthropic、硅基流动 (SiliconFlow) 四选一，生成小红书风格标题、摘要、标签和卡片布局\n- **交互式预览** — 浏览器中拖拽排序、删除卡片、编辑标题/摘要/标签\n- **导出打包** — 一键下载 zip（所有图片 + 发布文案.txt），方便手动发布到任意平台\n- **状态追踪** — SHA256 哈希防重复生成，生成历史记录\n- **Web 控制台** — Vite + React + Tailwind 构建的浏览器控制台，非技术用户也能操作\n- **Docker 部署** — 一键容器化部署，内置 Playwright Chromium + 中文字体\n\n## 两种使用方式\n\n**CLI 模式** — 开发者在本地终端操作：\n```bash\nmd2red run article.md\n# 生成图片 → 打开预览 → 导出 zip 手动发布\n```\n\n**Web 控制台模式** — 部署到服务器，浏览器中操作：\n```bash\ndocker compose up -d\n# 访问 http://服务器IP:3001\n```\n\n## 安装\n\n```bash\ngit clone https://github.com/LLM-X-Factorer/md2red.git\ncd md2red\nnpm install\nnpm run build:all\n```\n\n### 环境要求\n\n- **Node.js 20+**\n- Playwright Chromium 会自动安装（用于图片渲染截图）\n\n## 使用指南\n\n### 第一步：初始化配置\n\n```bash\nmd2red init\n```\n\n在当前目录生成 `md2red.config.yml` 配置文件。默认配置即可使用，无需额外设置。\n\n如果需要 LLM 智能内容策略（更好的标题、摘要和卡片排布），设置 API Key：\n\n```bash\n# 三选一：\nexport GEMINI_API_KEY=your-key      # Google Gemini\nexport OPENAI_API_KEY=your-key      # OpenAI\nexport ANTHROPIC_API_KEY=your-key   # Anthropic Claude\n```\n\n### 第二步：生成图片卡片\n\n**直接模式**（不需要 LLM）：\n\n```bash\nmd2red generate 我的文章.md\n```\n\n**LLM 策略模式**（生成更好的标题、摘要、标签和卡片布局）：\n\n```bash\nmd2red generate -s 我的文章.md\n```\n\n常用选项：\n\n```bash\nmd2red generate 文章.md -t light     # 亮色主题\nmd2red generate 文章.md --cards 6    # 限制最多 6 张卡片\nmd2red generate 文章.md -o ./output  # 自定义输出目录\n```\n\n输出目录默认为 `md2red-output/\u003c文件名\u003e/`，包含：\n- `01-cover.png`、`02-content.png`、... `08-summary.png` — 图片卡片\n- `strategy.json` — 内容策略数据（标题、摘要、标签）\n\n### 第三步：预览和编辑\n\n```bash\nmd2red preview md2red-output/我的文章/\n```\n\n浏览器打开交互式编辑器，你可以：\n- **浏览卡片** — 左右箭头键或点击缩略图\n- **拖拽排序** — 拖动缩略图调整卡片顺序\n- **删除卡片** — 移除不想要的卡片\n- **编辑标题** — 从 LLM 候选中选择或输入自定义标题\n- **编辑摘要** — 修改笔记正文\n- **管理标签** — 添加或删除标签\n\n### 第四步：导出发布\n\n在预览页面点击 **「导出图片+文案」** 下载 zip 包，包含所有图片和发布文案，然后手动上传到小红书或其他平台。\n\n### 一键全流程\n\n```bash\nmd2red run 我的文章.md\n```\n\n自动执行：解析 → LLM 策略（如有 API Key）→ 生成图片 → 打开预览。\n\n## Markdown 格式\n\nmd2red 适用于标准 Markdown 格式：\n\n```markdown\n---\ntitle: 文章标题\ntags: [标签1, 标签2]\n---\n\n# 主标题\n\n这里是引言段落...\n\n## 第一节\n\n第一张卡片的内容...\n\n## 第二节\n\n- 列表项会正确渲染\n- **加粗** 和 *斜体* 都支持\n- `行内代码` 也可以\n\n## 代码示例\n\n\\`\\`\\`typescript\nfunction hello() {\n  console.log('你好！');\n}\n\\`\\`\\`\n\n## 结语\n\n总结内容...\n```\n\n**内容如何映射到卡片：**\n- `H1` 或 frontmatter 中的 `title` → 封面卡片标题\n- 每个 `H2` 章节 → 一张内容卡片\n- 代码块 → 带语法高亮的代码卡片\n- 最后一张 → 自动生成的总结卡片\n\n## 命令一览\n\n```\n核心命令：\n  md2red run \u003cfile\u003e                完整流程：解析 → 策略 → 生成 → 预览\n    --force                        强制重新生成\n\n  md2red parse \u003cfile\u003e              解析 Markdown 并输出结构信息\n    -o, --output \u003cpath\u003e            保存解析 JSON\n\n  md2red generate \u003cfile\u003e           解析并生成图片卡片\n    -s, --strategy                 使用 LLM 规划内容布局\n    -t, --theme \u003cname\u003e             主题：dark 或 light\n    --cards \u003cnumber\u003e               最大卡片数量\n\n  md2red preview \u003cdir\u003e             在浏览器中交互式预览编辑\n    -p, --port \u003cnumber\u003e            服务端口（0 = 自动分配）\n\n工具命令：\n  md2red history                   查看生成历史\n  md2red history clear             清除历史记录\n  md2red init                      生成配置文件\n```\n\n## 配置说明\n\n在项目根目录创建 `md2red.config.yml`（或运行 `md2red init`）：\n\n```yaml\nllm:\n  provider: gemini           # gemini | openai | anthropic\n  # model: gemini-2.5-flash  # 可选，按 provider 自动选择默认模型\n  apiKey: ${GEMINI_API_KEY}  # 支持环境变量替换\n  temperature: 0.7\n  maxTokens: 4096\n\nimages:\n  theme: dark                # dark | light\n  brandColor: '#6366f1'\n\ncontent:\n  maxCards: 9                # 最大卡片数（含封面和总结）\n  targetAudience: 技术开发者\n  style: technical           # technical | casual | mixed\n```\n\n## 架构\n\n```\nMarkdown 文件\n    ↓\n[解析层]        remark → MDAST → ContentBlocks\n    ↓\n[策略层]        LLM (Gemini/OpenAI/Claude) → 标题、摘要、标签、卡片计划\n    ↓\n[生成层]        React SSR → HTML → Playwright 截图 → 1080×1440 PNG\n    ↓\n[预览层]        交互式 HTML 编辑器（拖拽排序、编辑、确认）\n    ↓\n[导出]          图片 + 文案 → zip 下载 → 手动发布\n```\n\n## Web 控制台\n\nmd2red 提供了浏览器控制台，部署到服务器后，非技术用户也能通过网页完成所有操作。\n\n**功能页面：**（亮色主题 UI）\n- **首页** — 生成记录统计、最近记录、快捷入口\n- **上传生成** — 拖拽上传 Markdown → 解析 → 选择主题/LLM → 生成图片（实时进度）\n- **预览编辑** — 卡片轮播、编辑标题/摘要/标签、导出 zip\n- **生成历史** — 记录表格，每条可直接导出或查看\n- **设置** — LLM 提供商、主题、品牌色、内容风格等配置\n\n**本地开发：**\n```bash\nnpm run build:all          # 构建后端 + 前端\nnpm run start:web          # 启动 http://localhost:3001\n\n# 或分别开发（热更新）\nnpm run dev:web            # 前端 Vite dev server (5173)\nnode dist/web/server.js    # 后端 API (3001)\n```\n\n## Docker 部署\n\n```bash\n# 1. 克隆项目\ngit clone https://github.com/LLM-X-Factorer/md2red.git /opt/md2red\ncd /opt/md2red\n\n# 2. 配置环境变量（可选，用于 LLM 策略）\necho \"GEMINI_API_KEY=your-key\" \u003e .env\n\n# 3. 构建并启动\ndocker compose build\ndocker compose up -d\n\n# 4. 访问 Web 控制台\n# 浏览器打开 http://服务器IP:3001\n\n# 后续更新代码：\ngit pull \u0026\u0026 CACHE_BUST=$(date +%s) docker compose build \u0026\u0026 docker compose restart\n```\n\nDocker 镜像内置 Playwright Chromium + 中文字体。\n\n**容器内数据持久化：**\n- 历史记录 → `md2red-data` volume（`/data`）\n- Markdown 文件 → `./articles` 映射到 `/articles`\n- 生成输出 → `./output` 映射到 `/output`\n\n**密码保护：**\n设置环境变量 `MD2RED_PASSWORD` 启用 Web 控制台登录保护：\n```bash\necho \"MD2RED_PASSWORD=你的密码\" \u003e\u003e .env\n```\n不设置则无需密码。\n\n**CI/CD 自动部署：**\ncommit message 包含 `[deploy]` 时，GitHub Actions 自动 SSH 到服务器拉取最新代码并重建容器。需在 GitHub Settings → Secrets 中配置 `DEPLOY_HOST`、`DEPLOY_USER`、`DEPLOY_KEY`。\n\n## 技术栈\n\n- **TypeScript** + Node.js (ESM)\n- **React** (SSR 图片渲染 + Web 控制台前端)\n- **Vite** + **Tailwind CSS** (Web 控制台构建)\n- **Playwright** (headless Chromium 截图)\n- **unified/remark** (Markdown 解析 + rehype HTML 渲染)\n- **Shiki** (语法高亮)\n- **Gemini / OpenAI / Anthropic** (内容策略)\n- **Zod** (配置验证)\n- **Commander.js** (CLI)\n- **Docker** (容器化部署)\n\n## 测试\n\n```bash\nnpm test              # 单元测试\nnpm run test:e2e      # E2E 测试\nnpm run test:all      # 全部测试\n```\n\n## 许可证\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fllm-x-factorer%2Fmd2red","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fllm-x-factorer%2Fmd2red","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fllm-x-factorer%2Fmd2red/lists"}