Markit Markdown Converter

作者 reason-machines2384a003145a無授權條款83 個星標收錄於 2026年10月8日更新於 2026年10月8日儲存庫3 個月前更新

Convert files, URLs, and media to markdown using the markit-ai CLI and SDK with pluggable converters and LLM support.

僅含說明Documents & Office
AI 產生的概覽

透過 markit-ai CLI 與 TypeScript SDK,將 PDF、DOCX、圖片、音訊等檔案、網址與媒體轉換為 markdown。

功能
此技能說明如何使用 markit-ai 命令列工具與 TypeScript/Node.js 函式庫,把多種格式——PDF、Word、PowerPoint、Excel、HTML、EPUB、筆記本、CSV、JSON、YAML、圖片、音訊、ZIP 壓縮檔、原始碼以及網頁連結——轉換為 markdown。內容涵蓋安裝、用於輸出檔案、原始輸出或 JSON 輸出以及標準輸入的 CLI 參數、用於圖片描述與音訊轉錄的 LLM 設定、SDK 用法,以及撰寫或安裝可外掛的轉換器與提供者。產出為 markdown 文字,可寫入檔案或以結構化 JSON 輸出。
適用情境
當你需要把文件、網頁或媒體轉換為 markdown 以便閱讀、管線傳遞或後續處理時使用。也適用於為圖片或音訊轉換設定 LLM 提供者,或以自訂轉換器外掛擴充 markit。
執行需求
需要 Node.js 與 markit-ai 套件(npm、bun 或 pnpm);AI 描述與轉錄需要 OPENAI_API_KEY 或 ANTHROPIC_API_KEY 等 API 金鑰,網址轉換需要網路存取。此技能不附帶指令碼,僅為說明文件。

markit-markdown-converter

Skill by ara.so — Daily 2026 Skills collection.

markit converts almost anything to markdown: PDFs, Word docs, PowerPoint, Excel, HTML, EPUB, Jupyter notebooks, RSS feeds, CSV, JSON, YAML, images (with EXIF + AI description), audio (with metadata + AI transcription), ZIP archives, URLs, Wikipedia pages, and source code files. It works as a CLI tool and as a TypeScript/Node.js library, supports pluggable converters, and integrates with OpenAI, Anthropic, and any OpenAI-compatible LLM API.


Installation

bash
# Global CLInpm install -g markit-ai
# Or as a project dependencynpm install markit-ai# bun add markit-ai# pnpm add markit-ai

CLI Quick Reference

bash
# Convert a filemarkit report.pdfmarkit document.docxmarkit slides.pptxmarkit data.xlsxmarkit notebook.ipynb
# Convert a URLmarkit https://example.com/articlemarkit https://en.wikipedia.org/wiki/Markdown
# Convert media (requires LLM API key for AI features)markit photo.jpgmarkit recording.mp3markit diagram.png -p "Describe the architecture and data flow"markit receipt.jpg -p "List all line items with prices as a table"
# Output optionsmarkit report.pdf -o report.md          # Write to filemarkit report.pdf -q                    # Raw markdown only (great for piping)markit report.pdf --json                # Structured JSON output
# Read from stdincat file.pdf | markit -
# Pipe outputmarkit report.pdf | pbcopymarkit data.xlsx -q | some-other-tool
# List supported formatsmarkit formats
# Configurationmarkit init                              # Create .markit/config.jsonmarkit config show                       # Show resolved configmarkit config get llm.modelmarkit config set llm.provider anthropicmarkit config set llm.model claude-haiku-4-5
# Pluginsmarkit plugin install npm:markit-plugin-dwgmarkit plugin install git:github.com/user/markit-plugin-ocrmarkit plugin install ./my-plugin.tsmarkit plugin listmarkit plugin remove dwg
# Agent integrationmarkit onboard                           # Adds usage instructions to CLAUDE.md

AI / LLM Configuration

Images and audio always get free metadata extraction. AI-powered description and transcription requires an API key.

bash
# OpenAI (default)export OPENAI_API_KEY=sk-...markit photo.jpg
# Anthropicexport ANTHROPIC_API_KEY=sk-ant-...markit config set llm.provider anthropicmarkit photo.jpg
# OpenAI-compatible APIs (Ollama, Groq, Together, etc.)markit config set llm.apiBase http://localhost:11434/v1markit config set llm.model llama3.2-visionmarkit photo.jpg

.markit/config.json (created by markit init):

json
{  "llm": {    "provider": "openai",    "apiBase": "https://api.openai.com/v1",    "model": "gpt-4.1-nano",    "transcriptionModel": "gpt-4o-mini-transcribe"  }}

Environment variables always override config file values. Never store API keys in the config file — use env vars.

ProviderEnv VarsDefault Vision Model
openaiOPENAI_API_KEY, MARKIT_API_KEYgpt-4.1-nano
anthropicANTHROPIC_API_KEY, MARKIT_API_KEYclaude-haiku-4-5

SDK Usage

Basic File and URL Conversion

typescript
import { Markit } from "markit-ai";
const markit = new Markit();
// Convert a file by pathconst { markdown } = await markit.convertFile("report.pdf");console.log(markdown);
// Convert a URLconst { markdown: webMd } = await markit.convertUrl("https://example.com/article");
// Convert a Buffer with explicit type hintimport { readFileSync } from "fs";const buffer = readFileSync("document.docx");const { markdown: docMd } = await markit.convert(buffer, { extension: ".docx" });

With OpenAI for Vision + Transcription

typescript
import OpenAI from "openai";import { Markit } from "markit-ai";
const openai = new OpenAI(); // reads OPENAI_API_KEY from env
const markit = new Markit({  describe: async (image: Buffer, mime: string) => {    const res = await openai.chat.completions.create({      model: "gpt-4.1-nano",      messages: [        {          role: "user",          content: [            { type: "text", text: "Describe this image in detail." },            {              type: "image_url",              image_url: {                url: `data:${mime};base64,${image.toString("base64")}`,              },            },          ],        },      ],    });    return res.choices[0].message.content ?? "";  },
  transcribe: async (audio: Buffer, mime: string) => {    const res = await openai.audio.transcriptions.create({      model: "gpt-4o-mini-transcribe",      file: new File([audio], "audio.mp3", { type: mime }),    });    return res.text;  },});
const { markdown } = await markit.convertFile("photo.jpg");

With Anthropic for Vision

typescript
import Anthropic from "@anthropic-ai/sdk";import OpenAI from "openai";import { Markit } from "markit-ai";
const anthropic = new Anthropic(); // reads ANTHROPIC_API_KEY from envconst openai = new OpenAI();       // reads OPENAI_API_KEY from env
// Mix providers: Claude for images, OpenAI Whisper for audioconst markit = new Markit({  describe: async (image: Buffer, mime: string) => {    const res = await anthropic.messages.create({      model: "claude-haiku-4-5",      max_tokens: 1024,      messages: [        {          role: "user",          content: [            {              type: "image",              source: {                type: "base64",                media_type: mime as "image/jpeg" | "image/png" | "image/gif" | "image/webp",                data: image.toString("base64"),              },            },            { type: "text", text: "Describe this image." },          ],        },      ],    });    return (res.content[0] as { text: string }).text;  },
  transcribe: async (audio: Buffer, mime: string) => {    const res = await openai.audio.transcriptions.create({      model: "gpt-4o-mini-transcribe",      file: new File([audio], "audio.mp3", { type: mime }),    });    return res.text;  },});

Using Built-in Providers via Config

typescript
import { Markit, createLlmFunctions, loadConfig, loadAllPlugins } from "markit-ai";
// Reads .markit/config.json and env vars automaticallyconst config = loadConfig();
// Load any installed pluginsconst plugins = await loadAllPlugins();
// Create instance with built-in providers + pluginsconst markit = new Markit(createLlmFunctions(config), plugins);
const { markdown } = await markit.convertFile("report.pdf");

Writing a Plugin

Plugins let you add new formats or override built-in converters. Plugin converters run before built-ins.

Basic Converter Plugin

typescript
// my-plugin.tsimport type { MarkitPluginAPI } from "markit-ai";
export default function (api: MarkitPluginAPI) {  api.setName("my-format");  api.setVersion("1.0.0");
  api.registerConverter(    {      name: "myformat",      accepts: (info) => [".myf", ".myfmt"].includes(info.extension ?? ""),      convert: async (input: Buffer, info) => {        // info.extension, info.mimeType, info.fileName available        const text = input.toString("utf-8");        const markdown = `# Converted\n\n\`\`\`\n${text}\n\`\`\``;        return { markdown };      },    },    // Optional: declare so it appears in `markit formats`    { name: "My Format", extensions: [".myf", ".myfmt"] },  );}

Override a Built-in Converter

typescript
// better-pdf-plugin.tsimport type { MarkitPluginAPI } from "markit-ai";
export default function (api: MarkitPluginAPI) {  api.setName("better-pdf");  api.setVersion("1.0.0");
  // Runs before built-in PDF converter, effectively replacing it  api.registerConverter({    name: "pdf",    accepts: (info) => info.extension === ".pdf",    convert: async (input: Buffer, info) => {      // Custom PDF extraction logic      const markdown = `# PDF Content\n\n(extracted with custom logic)`;      return { markdown };    },  });}

Register a Custom LLM Provider

typescript
import type { MarkitPluginAPI } from "markit-ai";
export default function (api: MarkitPluginAPI) {  api.setName("gemini-provider");
  api.registerProvider({    name: "gemini",    envKeys: ["GOOGLE_API_KEY"],    defaultBase: "https://generativelanguage.googleapis.com/v1beta",    defaultModel: "gemini-2.0-flash",    create: (config, prompt) => ({      describe: async (image: Buffer, mime: string) => {        // Call Gemini API here        return "Image description from Gemini";      },    }),  });}

Install and Use a Plugin

bash
# Install from filemarkit plugin install ./my-plugin.ts
# Install from npmmarkit plugin install npm:markit-plugin-dwg
# Install from gitmarkit plugin install git:github.com/user/markit-plugin-ocr
# Verifymarkit plugin list
# Removemarkit plugin remove my-format

Common Patterns

Batch Convert a Directory

typescript
import { Markit } from "markit-ai";import { readdirSync, readFileSync, writeFileSync } from "fs";import { extname, basename, join } from "path";
const markit = new Markit();const inputDir = "./docs";const outputDir = "./docs-md";
const files = readdirSync(inputDir);for (const file of files) {  const ext = extname(file);  if (![".pdf", ".docx", ".html"].includes(ext)) continue;
  const buffer = readFileSync(join(inputDir, file));  const { markdown } = await markit.convert(buffer, { extension: ext });  const outName = basename(file, ext) + ".md";  writeFileSync(join(outputDir, outName), markdown);  console.log(`Converted: ${file} → ${outName}`);}

Convert URL List

typescript
import { Markit } from "markit-ai";
const markit = new Markit();const urls = [  "https://example.com/article-1",  "https://example.com/article-2",  "https://en.wikipedia.org/wiki/TypeScript",];
const results = await Promise.all(  urls.map(async (url) => {    const { markdown } = await markit.convertUrl(url);    return { url, markdown };  }));
for (const { url, markdown } of results) {  console.log(`\n## ${url}\n\n${markdown.slice(0, 200)}...`);}

CLI in Agent/Automation Scripts

bash
# Structured JSON for programmatic parsingmarkit report.pdf --json
# Raw markdown for piping (no spinner, no extra output)markit report.pdf -q > report.md
# Pipe into another CLI toolmarkit https://example.com/article -q | wc -w
# Process multiple files in a shell loopfor f in docs/*.pdf; do  markit "$f" -o "out/$(basename "$f" .pdf).md"done

Supported Formats Reference

FormatExtensions
PDF.pdf
Word.docx
PowerPoint.pptx
Excel.xlsx
HTML.html, .htm
EPUB.epub
Jupyter.ipynb
RSS/Atom.rss, .atom, .xml
CSV/TSV.csv, .tsv
JSON.json
YAML.yaml, .yml
XML/SVG.xml, .svg
Images.jpg, .png, .gif, .webp
Audio.mp3, .wav, .m4a, .flac
ZIP.zip
Code.py, .ts, .go, .rs, and more
Plain text.txt, .md, .rst, .log
URLshttp://, https://

Run markit formats to see the full live list including any installed plugins.


Troubleshooting

AI description/transcription not working

  • Ensure the correct env var is set: OPENAI_API_KEY or ANTHROPIC_API_KEY
  • Run markit config show to verify the resolved provider and model
  • For custom API bases (Ollama, etc.), confirm the server is running and the model supports vision

Plugin not loading

  • Run markit plugin list to confirm it's installed
  • Check the plugin exports a default function matching (api: MarkitPluginAPI) => void
  • Try reinstalling: markit plugin remove <name> then markit plugin install <source>

PDF returns empty or garbled markdown

  • The built-in converter uses text extraction (not OCR). Scanned PDFs need an OCR plugin.
  • Try a custom plugin or pre-process with an OCR tool first.

Stdin (markit -) not working

  • Pipe content directly: cat file.pdf | markit -
  • Ensure the file type can be detected from content; use explicit hints if needed.

Config not being read

  • Config is loaded from .markit/config.json relative to the current working directory
  • Run markit init to create it, then markit config show to verify

來源與署名

來源:reason-machines/trending-skills位於skills/markit-markdown-converter提交2384a00

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架