Install
openclaw skills install @bonniegeng-max/md-out-of-chat把 Markdown 文件变成手机能直接打开的单页 HTML——本地运行、不上传、不需要账号和 API Key。支持一次转换一个文件,也支持把一个目录里「今天 / 本周」改动过的 .md 批量转成手机可读页面(无状态文件、不依赖定时任务)。Convert a Markdown file into a mobile-friendly, local HTML page that opens in any phone browser — markdown to html, chat export reader, batch convert a folder of recent notes (today / this week). WeChat/Feishu/Slack/Discord-friendly view. Use when a .md report, note, or chat export needs to be read or shared on a phone, or when you're away from your computer and want everything you made today readable on mobile. Runs 100% locally with no API key, no account, no upload. A public web URL is produced only when the user explicitly asks for it AND confirms, using a trusted deploy tool. This skill does not generate images or screenshots. Respond in the user's current language.
openclaw skills install @bonniegeng-max/md-out-of-chatPulling Markdown out of chat, into something people can actually read.
AI agents live in chat (WeChat, Feishu, Slack, Discord, …) and love to write .md. But .md doesn't render well in any of those apps. Code breaks, tables misalign, links look dead. This skill is the bridge: it takes a .md file and turns it into a mobile-friendly, copyable, shareable view.
Only activate this skill when both conditions hold: (1) the user explicitly mentions it by name (e.g. "use md-out-of-chat", "用 md-out-of-chat 转换"), and (2) the user identifies a concrete input — a .md file path, an attached file, a file selected in the conversation, or (for batch export) a named folder. Do not activate on vague phrases alone ("show me this", "转一下", "convert this"), and never infer conversion targets from chat history. Only read the file(s) the user explicitly identified. Never deploy, publish, or invoke other tools unless the user separately requests and confirms that action.
.md files cannot be opened in WeChat on mobile.md filehtml (local file, default) or web (public URL — see the strict conditions below).html file that opens in any mobile browserweb: a public URL only if the user explicitly asks for it, explicitly confirms before anything is deployed, and the assistant has a trusted deploy tool; otherwise fall back to local HTML#1F4E79 (deep blue, used for titles & headings)#3B7DD8 (bright blue, used for emphasis)#F5F7FA (light gray)#FFFFFF (white)#333333 (main) / #666666 (secondary)#E1E5EBsystem-ui, -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif"SF Mono", Menlo, Monaco, Consolas, monospace**bold** → strong, *italic* → em, `code` → inline codewhite-space: nowrap on headersPYTHON, SQL, BASH)- [ ] / - [x] render as checkboxes (done items struck through)> lines render as a left-accent-border quote block, gray text[text](url) renders as styled anchor; only http: / https: / mailto: schemes allowed (XSS-safe)word-break: break-all)\| escapes a literal pipe inside cellsDefault to local HTML for safety and privacy. Only produce a public web URL when the user explicitly asks for one, explicitly confirms, and the assistant has a safe deploy path. Do not generate screenshots — this skill produces HTML only.
When the user asks to view a Markdown file without specifying the output type, generate a local .html file. Tell the user where it is and that it can be opened on a phone browser.
This skill does not render PNGs. If the user asks for a screenshot:
Generate a public URL only when all of these hold:
Never generate a public URL silently. If deployment is not available, fall back to local HTML and explain why. build_and_deploy.sh is off by default — run it only after the user explicitly asks for a deployable folder.
When you're away from your computer and want everything you made recently readable on your phone, convert a whole folder in one pass. Triggered by "导出今天" / "导出本周" / "batch export today" together with an explicitly named folder — never guess a folder.
python3 md2share.py <目录> # 该目录下所有 .md(只扫一层)
python3 md2share.py <目录> --since=today # 只转今天改过的
python3 md2share.py <目录> --since=week # 只转本周(周一 00:00 起)改过的
python3 md2share.py <目录> --since=7d # 最近 7 天
python3 md2share.py <目录> --since=2026-09-20 # 指定日期之后
python3 md2share.py <目录> <输出目录> # 输出集中到另一个目录
Rules for batch mode:
.md-out-of-chat/ state, nothing to go stale — this is why the skill stays a pure converter.*.md directly inside the named folder is converted. Subfolders are never walked, so pointing at a broad folder cannot cascade through your whole disk.note.md → note.html), or into the second argument if given. Existing .html files are simply overwritten with the fresh render.< 480px widthmd2share.py only reads the input .md and writes a local .html file.*.md in the folder you named, compares against each file's own modification time, and writes only .html output. It creates no state file, index, or tracking directory, and it never moves, renames, or deletes anything.build_and_deploy.sh only prepares a local dist/ folder; it does not upload anything and is off by default.) are embedded as base64 only if they live in the same directory as the Markdown file or a subdirectory of it. Absolute paths and directory traversal (../) are never embedded. Image files are validated by content (magic bytes) before embedding, and every embedded file path is logged to stderr so the user can audit exactly what was read.# 1. Write or place your .md file
# 2. Generate a local HTML file (default: local images under .md dir are embedded)
python3 md2share.py my-notes.md
# 3. Batch: convert a whole folder, optionally only what changed recently
python3 md2share.py ~/notes --since=today
# 4. (Optional, only on explicit request) Build dist/ for deployment
./build_and_deploy.sh my-notes.md
md2share.py — Core script (md → local html; single file or one-level folder batch)build_and_deploy.sh — Optional local build helper (prepares dist/; off by default)SKILL.md — This file../ traversal are never embedded; image content is validated via magic bytes before embedding; every embedded path is logged to stderr; remote images rendered as a link placeholder so no network request is made)*.md beside each other); it does not recurse into subfolders, and it keeps no record of what it converted before — re-running simply re-renders[^id] refs render as superscript anchors, definitions collected into a NOTES section at the bottom with back-links---, ***, ___) render as styled dividersprefers-color-scheme with a manual toggle that remembers the choice