Markitai
Opinionated Markdown converter with native LLM enhancement support.
- Multi-format: DOCX, PPTX, XLSX, PDF, EPUB, EML, TXT, MD, images (JPG/PNG/WebP), and URLs → clean Markdown; legacy
.doc/.pptvia thelegacyextra - LLM enhancement: AI-powered format cleaning, frontmatter metadata, and vision analysis of embedded images via litellm, so any provider works (OpenAI, Anthropic, Gemini, local CLIs, and more)
- Batch processing: concurrent conversion with progress display and
--resumefor interrupted jobs - OCR: scanned PDFs and images via local RapidOCR (optional extra, see below), or
--ocr --llmto have the vision model read the page images directly (VLM-OCR) - Web fetching: static HTTP with cache revalidation, or Playwright rendering for JS-heavy pages
- Local web workspace: upload files or folders, submit URLs, configure LLM providers, compare results, retry failures, and revisit conversion history — CLI runs can opt in too, via
--record-history
Docs: https://markitai.dev
Install
Recommended: guided installer. Checks/installs Python and uv, lets you pick extras, installs the optional Playwright browser, falls back to a mirror when it measures the default index as unreachable, and is bilingual (EN/中文):
# Linux/macOS
curl -fsSL https://markitai.dev/setup.sh | sh
# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://markitai.dev/setup.ps1 | iex"
Minimal (uv / pip), if you already have Python 3.11-3.13 and just want the package:
uv tool install markitai # isolated environment (recommended)
pipx install markitai # or pipx
After a uv/pip install, do the setup steps the guided installer would have done for you:
markitai doctor # check core and optional capabilities
markitai init # create a config and set up an LLM provider
If you need Playwright browser rendering, add its package before asking doctor to install Chromium:
uv tool install "markitai[browser]" --force # uv tool install
# pipx install "markitai[browser]" --force # pipx alternative
markitai doctor --fix # install Chromium
Both installs provide the markitai command and the shorter mkai alias.
They are the same command (mkai --help == markitai --help). If you already
have a different mkai on your PATH, use the full markitai to avoid ambiguity.
Extras
| Extra | Enables |
|---|---|
browser |
Playwright rendering for JS-heavy pages |
claude-agent |
Claude Agent SDK as an LLM provider |
copilot |
GitHub Copilot SDK as an LLM provider |
extra-fetch |
curl-cffi HTTP client (better anti-bot compatibility) |
heif |
HEIC/HEIF/AVIF image input |
legacy |
Legacy Office conversion (.doc/.ppt) via the anydoc Rust backend |
mcp |
Bundled markitai-mcp server for AI agents (Model Context Protocol) |
ocr |
Local OCR for scanned PDFs and images (--ocr) |
serve |
Local web workspace and REST API |
svg |
SVG rasterization via cairosvg |
all |
Everything above |
The base install is deliberately lean (~475MB). ocr is the one extra that
adds real weight (~160MB of models and OpenCV), so it is opt-in:
uv tool install "markitai[ocr]" --force
The guided installer offers it as a yes/no question (defaulting to yes, and
remembering a "no" for the rest of the run); markitai doctor reports OCR as
an optional capability and prints this command when it is not installed.
Launch the local web workspace with:
uv tool install "markitai[serve]" --force
markitai serve
Quick start
markitai document.pdf -o out/ # convert a file
markitai https://example.com -o out/ # convert a URL
markitai ./docs -o out/ # batch convert a directory
markitai doctor # check dependencies and configuration
For LLM enhancement, export any supported provider key — markitai picks the model up from the environment, no config file needed:
export GEMINI_API_KEY=... # or OPENAI_/ANTHROPIC_/DEEPSEEK_/OPENROUTER_API_KEY
markitai document.pdf -o out/ --llm # clean formatting + generated frontmatter
markitai document.pdf --preset rich # LLM + alt text + descriptions + screenshots
markitai init # or configure it interactively, once
See the Getting Started guide for LLM configuration, presets, caching, and batch options.
MCP server
The MCP server markitai-mcp (bundled with markitai, enabled by the mcp extra) exposes conversion to AI agents over the Model Context Protocol: convert_document, convert_url, batch_convert, job_status. Zero install via uvx; large outputs land on disk instead of in the model context. For Claude Code, claude mcp add markitai -- uvx --from "markitai[mcp]" markitai-mcp; for other clients:
{
"mcpServers": {
"markitai": { "command": "uvx", "args": ["--from", "markitai[mcp]", "markitai-mcp"] }
}
}
markitai mcp starts the same server through the CLI itself (uvx --from "markitai[mcp]" markitai mcp), which is how the MCP Registry lists it. See the MCP guide for LLM enhancement and batch jobs.
Comparison
How markitai compares to three tools people mention in the same breath. No star or download counts — those go stale immediately.
| markitai | markitdown | docling | anydoc | |
|---|---|---|---|---|
| Engine | Python; rule-based conversion + optional LLM pipeline | Python; lightweight rule-based converters + plugins | Python; ML layout/table/VLM document-structure models | Rust; zero-ML parsers |
| LLM enhancement | Built-in: format cleaning, frontmatter, vision analysis, per-run JSON cost/usage reports | Optional: image captions, transcription, an OCR plugin | VLM for structure (DocTags), not prose cleanup | None |
| Web pages | 5-strategy fetch cascade, local-first; static runs a from-scratch port of defuddle's readability algorithm before falling back to a browser or 3 remote APIs | Whole-DOM HTML→Markdown, no main-content pass | Downloads a document URL into the same file pipeline | No URL input — local files/bytes only |
| Scanned docs | Optional local OCR (markitai[ocr], RapidOCR), or --ocr --llm to have the vision model read the pages |
Optional plugin (LLM-vision or Azure OCR) | Built-in OCR for scanned PDFs/images | None in the OSS library |
| Positioning | Independent project; CLI + local bilingual (EN/中文) web workspace | Microsoft (AutoGen team); widest ecosystem/plugin adoption | IBM Research origin, now governed by the LF AI & Data Foundation; enterprise RAG building block | Firecrawl open-source; dependency-free, millisecond-scale, 14 formats, Node/Python/WASM bindings |
Each optimizes for a different job: anydoc for dependency-free speed, docling for ML-driven document structure in RAG pipelines, markitdown for ecosystem reach — markitai trades those for a built-in LLM pipeline, live web fetching, and a local UI. Two of them are also dependencies rather than only alternatives: markitdown converts the Office formats, and anydoc handles legacy .doc/.ppt behind markitai[legacy].
License
markitai's own source code is MIT.
The default installation is not uniformly MIT, because the PDF engine is not.
The PyMuPDF packages pymupdf, pymupdf-layout, and pymupdf4llm come from
Artifex Software and are
dual-licensed under AGPL-3.0 or a commercial licence from Artifex. They are
core dependencies — PDF conversion does not work without them.
For local use — running the CLI on your own machine, or a markitai serve
instance only you talk to — this changes nothing. AGPL obligations attach when
you redistribute the combined work or offer it to other people over a network:
in that case AGPL-3.0 asks you to make the corresponding source available on the
same terms, or to buy a commercial licence from Artifex
instead.
Everything else in the default install is MIT, Apache-2.0, BSD, or MIT-CMU. CI
enforces this: scripts/check_licenses.py fails the build on any
non-commercial or proprietary dependency, and on any AGPL/GPL package outside an
explicit allowlist.
Full details, plus attribution for the code markitai ports from defuddle (MIT) and marker (Apache-2.0), are in NOTICE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file markitai-1.0.0.tar.gz.
File metadata
- Download URL: markitai-1.0.0.tar.gz
- Upload date:
- Size: 3.7 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1e4a77b1bf8cbe35cbf00b3a24a77068a7cd14213c332b9d39e7b9f5ca81b25c
|
|
| MD5 |
d9c924b9a2f014b782099ae8eb952e5f
|
|
| BLAKE2b-256 |
59061a44ecfe615051902538972fe2e91a99280f806904e5132b0561034abe24
|
Provenance
The following attestation bundles were made for markitai-1.0.0.tar.gz:
Publisher:
publish.yml on Ynewtime/markitai
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
markitai-1.0.0.tar.gz -
Subject digest:
1e4a77b1bf8cbe35cbf00b3a24a77068a7cd14213c332b9d39e7b9f5ca81b25c - Sigstore transparency entry: 2771371376
- Sigstore integration time:
-
Permalink:
Ynewtime/markitai@03620cff137255a03114993e9e3626c1e931b090 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/Ynewtime
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@03620cff137255a03114993e9e3626c1e931b090 -
Trigger Event:
push
-
Statement type:
File details
Details for the file markitai-1.0.0-py3-none-any.whl.
File metadata
- Download URL: markitai-1.0.0-py3-none-any.whl
- Upload date:
- Size: 1.3 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
144ebf668ec8d29a85b1ffd5603b04820a4b086b1db2c3f82e47955f10188e24
|
|
| MD5 |
d53d357484af07a68cdd44feddc888f6
|
|
| BLAKE2b-256 |
e66c9f050a59163a04930d40c572c0fa68d9c512abea7caabb243a3cde8b470c
|
Provenance
The following attestation bundles were made for markitai-1.0.0-py3-none-any.whl:
Publisher:
publish.yml on Ynewtime/markitai
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
markitai-1.0.0-py3-none-any.whl -
Subject digest:
144ebf668ec8d29a85b1ffd5603b04820a4b086b1db2c3f82e47955f10188e24 - Sigstore transparency entry: 2771371449
- Sigstore integration time:
-
Permalink:
Ynewtime/markitai@03620cff137255a03114993e9e3626c1e931b090 -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/Ynewtime
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@03620cff137255a03114993e9e3626c1e931b090 -
Trigger Event:
push
-
Statement type: